python画柱状图
最近写paper需要画柱状图,所以网上找了很多例子,一边看一边学。有时候会想:人最初学习的的方法是观察法,引申为模仿。反而我所经历过的学习是反者来的,从小到大,先交给我定理,真理,再告诉我题目怎么解,如此而已。和人类最初学习的方法很不一样,这是人类进化了呢,还是说走了弯路呢?(---分割线---)1.第一个例子:Python绘制柱状图import os#输入想要存储图像的路径os.chdir('路
最近写paper需要画柱状图,所以网上找了很多例子,一边看一边学。有时候会想:人最初学习的的方法是观察法,引申为模仿。反而我所经历过的学习是反者来的,从小到大,先交给我定理,真理,再告诉我题目怎么解,如此而已。和人类最初学习的方法很不一样,这是人类进化了呢,还是说走了弯路呢?(---分割线---)
1.第一个例子:Python绘制柱状图
import os
#输入想要存储图像的路径
os.chdir('路径')
import matplotlib.pyplot as plt
import numpy as np
#改变绘图风格
import seaborn as sns
sns.set(color_codes=True)
cell = ['HB','EVT','dS1','fFB1', 'fFB2', 'dM3','dS2','Tcells']
pvalue = [0.234,0.808,0.71,0.084,0.451,0.754,0.139,0.944]
width = 0.20
index = np.arange(len(cell))
p1 = np.arange(0,len(cell),0.01)
p2 = 0.05 + p1*0
q1 = np.arange(0,len(cell),0.01)
q2 = 0.1 + p1*0
figsize = (10,8)#调整绘制图片的比例
plt.plot(p1,p2,color = 'red',label = '5% significance level')#绘制直线
plt.plot(q1,q2,color = 'yellow',label = '10% significance level')#绘制直线
#若是不想显示直线,可以直接将上面两行注释掉
plt.bar(index, pvalue, width,color="#87CEFA") #绘制柱状图
#plt.xlabel('cell type') #x轴
plt.ylabel('p value') #y轴
plt.title('Result of Network Screen') #图像的名称
plt.xticks(index, cell,fontsize=5) #将横坐标用cell替换,fontsize用来调整字体的大小
plt.legend() #显示label
plt.savefig('test.png',dpi = 400) #保存图像,dpi可以调整图像的像素大小
结果:
所以,主要的函数是:
plt.bar(index, pvalue, width,color="#87CEFA") #绘制柱状图
index和pvalue是列表,主要对应项目名称和数值,width表示宽度比例,不要超过1,会重叠。
颜色调整:
plt.bar(index, pvalue, width,color=['y','g','b', 'c', 'm', 'r','k','gold'])
其他颜色:
(这个很好,可以按照自己的审美选择)
2.第二个例子:python使用matplotlib画柱状图、散点图
但是我只看柱状图
import numpy as np
from matplotlib import pyplot as plt
plt.figure(figsize=(9, 6))
n = 8
X = np.arange(n) + 1.0
width = 0.36
# X是1,2,3,4,5,6,7,8,柱的个数
# numpy.random.uniform(low=0.0, high=1.0, size=None), normal
# uniform均匀分布的随机数,normal是正态分布的随机数,0.5-1均匀分布的数,一共有n个
Y1 = np.random.uniform(0.5, 1.0, n)
Y2 = np.random.uniform(0.5, 1.0, n)
plt.bar(X-width/2, Y1, width=width, facecolor='lightskyblue', edgecolor='white')
# width:柱的宽度
plt.bar(X+ width/2, Y2, width=width, facecolor='yellowgreen', edgecolor='white')
# 水平柱状图plt.barh,属性中宽度width变成了高度height
# 打两组数据时用+
# facecolor柱状图里填充的颜色
# edgecolor是边框的颜色
# 想把一组数据打到下边,在数据前使用负号
# plt.bar(X, -Y2, width=width, facecolor='#ff9999', edgecolor='white')
# 给图加text
for x, y in zip(X, Y1):
plt.text(x-width/2, y + 0.05, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y2):
plt.text(x + width/2, y + 0.05, '%.2f' % y, ha='center', va='bottom')
plt.ylim(0, +1.25)
plt.show()
结果:
小小的改了一下源程序,因为发现在ubuntu18.04上并不是运行的很好,text的分布有点偏离中心。
3.第三个例子,大同小异:python 画条形图(柱状图)实例
(除非有一天我用到,否则我不会区分直方图和条形图)
4.第四个例子:python 自定义图例(legend)
我很喜欢这个例子,因为看起来legend很舒服,博主说:“背景:不是所有的句柄(handles)都可以自动转化成legend,所以有必要自己创建一个artist来实现此功能,可参考一下下面官方的文档:legend_guide,文档只创建了一个图例,比如我有下图,我就需要四个图例:
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import numpy as np
if __name__ == '__main__':
max_lst_of_all = {} #一个字典,value是四季最大阵风的风速值,key是年份
max_lst_of_all[2010] = [29.7, 34.3, 29.7, 26.3]
max_lst_of_all[2011] = [36.0, 30.2, 27.3, 30.9]
max_lst_of_all[2012] = [27.3, 32.3, 40.4, 27.8]
max_lst_of_all[2013] = [35.9, 29.9, 40.1, 33.3]
max_lst_of_all[2014] = [26.3, 30.6, 28.6, 34.3]
max_lst_of_all[2015] = [33.1, 27.0, 25.4, 30.7]
max_lst_of_all[2016] = [41.3, 31.3, 41.1, 38.0]
max_lst_of_all[2017] = [27.5, 31.2, 43.2, 41.2]
fig = plt.figure()
for key in max_lst_of_all.keys():
print(max_lst_of_all[key])
x = np.arange(key-0.3, key+0.31, 0.2) #一年有四季,此行指定四季对应的bar的位置,比如2010年:2009.7,2009.9,2010.1,2010.3
y = max_lst_of_all[key] #此行决定了bar的高度(风速值)
#bar_width = 0.2
color = ['lightskyblue', 'lime', 'red', 'gold'] #指定bar的颜色
for x1, y1, c1 in zip(x, y, color): #遍历以上三者,每一次生成一条bar
plt.bar(x1, y1, width=0.2, color=c1)
#我试过这里不能直接生成legend,解决方法就是自己定义,创建legend
labels = ['winter', 'spring', 'summer', 'autumn'] #legend标签列表,上面的color即是颜色列表
#用label和color列表生成mpatches.Patch对象,它将作为句柄来生成legend
patches = [ mpatches.Patch(color=color[i], label="{:s}".format(labels[i]) ) for i in range(len(color)) ]
ax=plt.gca()
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width , box.height* 0.8])
#下面一行中bbox_to_anchor指定了legend的位置
ax.legend(handles=patches, bbox_to_anchor=(0.95,1.12), ncol=4) #生成legend
plt.show()
于是:
当然我也做了一些修改,因为我要横轴不是数字,而是字符。只要使用plt.xticks()函数就可以。
"在matplotlib中ticks表示的是刻度,而刻度有两层意思,一个是刻标(locs),一个是刻度标签(tick labels)。在作图时,x轴y轴都是连续的,所以刻标可以随意指定,就是在连续变量上找寻位置,而刻度标签则可以对应替换.
xticks(rotation:旋转度数):更改绘制x轴标签方向(与水平方向的逆时针夹角度数)"
#plt.xticks()返回了两个对象,一个是刻标(locs),另一个是刻度标签
locs, labels = plt.xticks()
# 显示x轴的刻标
plt.xticks( arange(6) )
# 显示x轴的刻标以及对应的标签
pltxticks( arange(5), ('Tom', 'Dick', 'Harry', 'Sally', 'Sue') )
其实这些用excel也能做,那为什么还选python呢?因为用了脑子越用越熟练。
更多推荐
所有评论(0)