对比Python与R语言于气泡图的制作——数据可视化

(引用或转载本文请注明出处)
近期因实际需要,笔者在此记录下利用Python以及R语言对测序结果做气泡图可视化的心得。代码中的数据为随机(其实是我乱按的)出来的数据并非实验室结果。文末将注明引用文献。本文仅供相互学习之用,如有侵权,请联系笔者删除。

做该项目的目的是:在横纵坐标代表两个变量的基础上,在散点图中实现对第三个甚至第四个变量的反映,并实现矢量图输出。

Python部分

这块代码因为是自用就没有怎么精简优化,个人感觉结构还能更漂亮一些。请大家留言或评论点拨点拨我好让我日后能快速改进,哈哈。
用到的库是:matplotlib和openpyxl。numpy没有用到。
主要的操作:导入Excel文件(注意是.xlsx而非.xls),对其中的数据进行操作。然后绘图,调参数。代码的使用及含义在每一行代码之后基本上都加上了相关的注释。

import matplotlib.pyplot as plt #引入matplotlib库,并将其简写为'plt'#
import numpy as np #引入numpy库,一个计算各种函数的库,虽然画这个图我没用上它,但是已经是一种习惯#
from openpyxl import load_workbook #引入load_workbook库,以便导入excel文件即'.xlsx'#
workbook =  load_workbook('C:\\Users\xxx.xlsx') #双引号内写入文件路径及文件名,注意斜线的类型以及文件名的类型
sheets = workbook.sheetnames #获取文件里所有表的名字
print(type(workbook.sheetnames)) #将名字写在控制台上,以便检查#

#开始操作Excel文件里的第一张表#
booksheet = workbook[sheets[1]] #获取第一张表里的内容
rows = booksheet.rows #获取第一张表里的行数
columns = booksheet.columns #获取第一张表里的列数
for row in rows:
    line = [col.value for col in row]
row_3 = list(booksheet.columns)[2] #获取第一张表里第x行的数据,获取列的内容只需要将rows换成columns
line_3= [col.value for col in row_3] #获取第一张表里的第x行数据,用list类型储存
row_5 = list(booksheet.columns)[4]
line_5 = [col.value for col in row_5]
row_6 = list(booksheet.columns)[5]
line_6 = [col.value for col in row_6]
print(line_3) #将第x行数据写在控制台上,方便对照检查
print(line_5) #同上
print(line_6)

#开始操作Excel文件里的第二张表#
booksheet1 = workbook[sheets[2]] #获取第二张表里的内容
rows1 = booksheet1.rows #获取第二张表里的行数
columns1 = booksheet1.columns #获取第二张表里的列数
for row1 in rows1:
    line1 = [col.value for col in row1]
row_31 = list(booksheet1.columns)[2] #获取第二张表里第x行的数据,获取列的内容只需要将rows换成columns
line_31= [col.value for col in row_31] #获取第二张表里的第x行数据,用list类型储存
row_51 = list(booksheet1.columns)[4]
line_51 = [col.value for col in row_51]
row_61 = list(booksheet1.columns)[5]
line_61 = [col.value for col in row_61]
print(line_31)
print(line_51)
print(line_61)

#开始操作Excel文件里的第三张表#
booksheet2 = workbook[sheets[3]] #获取第三张表里的内容
rows2 = booksheet2.rows #获取第三张表里的行数
columns2 = booksheet2.columns #获取第三张表里的列数
for row2 in rows2:
    line2 = [col.value for col in row2]
row_32 = list(booksheet2.columns)[2] #获取第一张表里第x行的数据,获取列的内容只需要将rows换成columns
line_32= [col.value for col in row_32] #获取第一张表里的第x行数据,用list类型储存
row_52 = list(booksheet2.columns)[4]
line_52 = [col.value for col in row_52]
row_62 = list(booksheet2.columns)[5]
line_62 = [col.value for col in row_62]
print(line_32)
print(line_52)
print(line_62)

#换些简单的变量赋上值,方便之后的画图,也可省略这一步#
x = line_3
y = line_5
z = line_6
x1 = line_31
y1 = line_51
z1 = line_61
x2 = line_32
y2 = line_52
z2 = line_62
#如果是导入的Excel的数据,就把x,y后面的数据换成line,而非[a1, a2, a3,...]#

#sValue = 0.3       # 设置点的大小,也可以直接换成x或y,这样相当于用点的大小反映第三个量
lValue = 0.05       # 设置
#cValue = z         # 不同颜色,换成x或y代表以x或y的数值大小设置颜色,颜色以颜色条为准,整个颜色条的颜色都能自动取到
dpi_value = 2000    #分辨率大小,数值越大越清晰,但运行会更慢
x_min = -6    #图中x坐标最小值
x_max = 1123    #图中x坐标最大值
y_min =  123   #图中y坐标最小值
y_max =  7    #图中y坐标最大值
#cmap_value = 'summer'  #颜色条设置,单引号别漏了

p1 = plt.scatter(x, y, c = 'darkorange', s = z, linewidth = lValue, marker ='o', alpha = 0.5, edgecolor = 'darkorange')
p2 = plt.scatter(x1, y1, c = 'royalblue', s = z1, linewidth = lValue, marker = 'o', alpha = 0.5, edgecolor = 'royalblue')
p3 = plt.scatter(x2, y2, c = 'Grey', s = z2, linewidth = lValue, marker = 'o', alpha = 0.4, edgecolor = 'grey')

#做线段#
x4 = [0.2,0.2] #第一条直线两个端点的横坐标
y4 = [2.3, 7] #第一条直线两个端点的纵坐标
x5 = [0.2,10] #第二条直线......
y5 = [1,1] #第二条直线......

#如果还需要更多的直线就继续加#
#以下为直线的代码#
plt.plot(x4, y4, linewidth=0.1,c = 'black', linestyle = '--') #第一条直线的代码
plt.plot(x5, y5, linewidth=0.1,c = 'black', linestyle = '--') #第二条直线
plt.plot(x6, y6, linewidth=0.1,c = 'black', linestyle = '--') #第三条直线
plt.plot(x7, y7, linewidth=0.1,c = 'black', linestyle = '--') #第四条直线
#如果还需要更多就照葫芦画瓢#

plt.xlim(x_min, x_max)#设置横坐标的可视范围#
plt.ylim(y_min, y_max)#设置纵坐标的可视范围#
plt.savefig('x.pdf', dpi=dpi_value, format = 'pdf') #'文件名、后缀(也可加入保存路径)'及'文件类型'记得统一,

plt.show()

结果展示(就截一小块图吧,看得出主要的东西就行)
对比Python与R语言于气泡图的制作——数据可视化_第1张图片
附:
若要引入第四个变量,可以利用颜色渐变的方法,参照一旁的色表即可对第四个变量有一个感性的认知。
对比Python与R语言于气泡图的制作——数据可视化_第2张图片上图源于网络,侵权请联系删除

对比Python与R语言于气泡图的制作——数据可视化_第3张图片
就像这样,你可以脑补出这些点大小不一以实现一图四变量的展示(开个玩笑,我就是懒)
主要用到colorbar和camp色带,这篇文章关于它们写的很棒很详细,放在这里供大家学习:

https://blog.csdn.net/liuchengzimozigreat/article/details/90477501?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control

R语言部分

不得不说R语言真的简洁,当然也有可能是我Python写啰嗦了。
用到的package:readxl,ggplot2.
主要操作:导入Excel(注意是.xlsx而非.xls),绘图

library(readxl)
library(ggplot2)

sheet <- read_excel(path ="C:/Users/xxx.xlsx",sheet = 5)
ggplot(sheet)+
  geom_point(aes(x=log,y=P_VALUE,size=change),color='darkorange',alpha = 0.5)+
  geom_point(aes(x=log1,y=P_VALUE1,size=change1),color='royalblue',alpha = 0.5)+
  geom_point(aes(x=log2,y=P_VALUE2,size=change2),color='grey',alpha = 0.4)+
  geom_line(aes(x=line_x,y=line_y),linetype='dashed',size=0.1,color = 'black')+
  geom_line(aes(x=line_x1,y=line_y1),linetype='dashed',size=0.1,color = 'black')+
  geom_line(aes(x=line_x2,y=line_y2),linetype='dashed',size=0.1,color = 'black')+
  geom_line(aes(x=line_x3,y=line_y3),linetype='dashed',size=0.1,color = 'black')+
  scale_size_continuous(range=c(0,10))+
  theme_bw()+
  
  theme(legend.position = "none")

其中scale_size_continuous(range=c(0,10))这行代码很有意思,0-10能控制点大小的范围,而不受原本定义大小参数的影响。

结果展示
对比Python与R语言于气泡图的制作——数据可视化_第4张图片
个人认为在透明度参数一致的情况下,R语言ggplot2包对灰色透明气泡的叠加效果表现并不出色。当然也有可能是我对代码的理解不够深。

小结

对于这种类型的图来说,Python与R各有特点各具优势,Python可以操纵的地方更多,R非常的简洁。但以我的代码功力来说,显然R因其短小精悍而毫无疑问胜出了。

参考文献
《Python编程 从数据分析到机器学习实践》刘瑜著 中国水利水电出版社,2020.2

你可能感兴趣的:(笔记,python,数据分析,可视化,excel)