使用Python 绘制双Y轴和误差棒柱状图

问题描述

近期在写毕业论文,有一篇参考论文里的图感觉很合适,但是当自己想依样画葫芦的时候发现问题还没那么简单。

使用Python 绘制双Y轴和误差棒柱状图_第1张图片

目标图

首先是带误差棒的柱状图。一开始我还不完全清楚这种头上顶个条的柱状图学名叫什么。只是大概知道这是一组数组形成的,应该和箱型图类似,表示误差或者说方差,柱状图是均值。于是就好办了,搜了一会儿知道了,这种图的名称叫带有误差棒的柱状图,其实也算比较常见,在Python里有多种实现方法。

其次是双Y轴的问题。同时具备以上两个条件的帖子就很难搜出来了,不知道学名或者标准称呼怎么讲,所以无从查起。没办法,只能自己尝试把它做出来,以下是代码:

代码部分

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['Microsoft YaHei']

x = ['11', '22', '33', '44','55']   #任意字符
y = [16.30, 12.94, 13.20, 13.58, 18.31]
error = [1.58, 0.78, 0.95, 2.24, 1.57] #误差或方差
z = [235.61,328.84,570.62,684.45,834.69] #第二个y轴的维度,此处为运行的时间

fig = plt.figure(figsize=(14,8),dpi=80)
ax1 = fig.add_subplot(111)
bar_width = 0.3 #柱状图宽度
ax1.bar(x, y, bar_width) #生成柱状图
ax1.errorbar(x, y, yerr=error, capsize=3, elinewidth=2, fmt=' k,')  #添加误差棒

plt.ylim(0, 35) #限定左侧Y轴显示尺度范围
plt.xlabel('The Number of XXX',size=20)
plt.ylabel('任意目标单位',size=20)
plt.xticks(size=15)
plt.yticks(size=15)
plt.grid(linestyle="--", alpha=1,which='both')  #添加网格线

ax2 = ax1.twinx()   #关键步骤,开始设置第二个Y轴的内容
ax2.plot(x,z,label='y2',marker='o',color='red')
plt.yticks(size=15)
plt.ylim(0, 1000)
plt.ylabel('Average Training Time(s)',size=20)
plt.show()

生成结果

使用Python 绘制双Y轴和误差棒柱状图_第2张图片

​其实在python里,生成误差棒很多模块都有比较简单的方法,但是在混用的时候容易出现问题。比如说我个人基础知识差一些,一开始有一些莫名其妙的问题。还好matplotlib本身就有误差棒函数,这样写下来就比较顺了。

结语

在这里啰嗦半天,说了很多非专业名称,还是希望像我一样刚入门的人,能够按自己的理解,通过不太规范的关键词检索到自己想要的内容。比如说柱状图加条或者加线,共享Y轴等等。如果真的能帮到各位,我不胜荣幸,也希望大家一键三连~

你可能感兴趣的:(python,matplotlib,贴图)