简介
我们有的时候需要将柱状图与折线图绘制在一起。柱状图来表示数据的分布,折线图来表示某种特征的分布。
这里我们就简单介绍一下如何使用matplotlib来绘制将柱状图与折线图结合在一起的图像。这里我们也是会利用绘制主次坐标的方式,这个可以参考这个链接 : Python绘制主次坐标图。
需要注意,如果我们想要绘制水平线,可以使用 matplotlib-axhline。
绘制方式
下面我们来详细讲一下绘制的过程与方法。我们会首先绘制折线图,接着使用ax2=ax1.twinx()来创建次坐标, 在次坐标上绘制折线图。
大体的过程如下面代码所示:
- # 创建数据
- rng = np.random.RandomState(10)
- data1 = rng.normal(size=1000)
- data2 = rng.normal(size=1000)
- # 创建分割
- binRange = np.arange(-4,4,1)
- hist1,_ = np.histogram(data1, bins=binRange)
- hist2,_ = np.histogram(data2, bins=binRange)
- ratio = hist2/(hist1+hist2) # 所占比例
- # 绘制图像
- fig, ax1 = plt.subplots()
- fig.set_size_inches(10, 6)
- plt.set_cmap('RdBu')
- x = np.arange(len(binRange)-1)*5
- # ----------
- # 绘制折线图
- # ----------
- ax1.plot(x, ratio, color='#1b71f1', linewidth=5, marker='o', markersize=17, linestyle='dashed')
- ax1.plot([x[0]-5*w, x[-1]+5*w], [0.2, 0.2], color='navy', lw=10, linestyle='-', alpha=0.3) # 这是一条直线
- ax1.plot([x[0]-5*w, x[-1]+5*w], [0.2, 0.2], color='black', lw=1, linestyle='--', alpha=0.3) # 这是一条直线
- ax1.yaxis.set_tick_params(labelsize=15) # 设置y轴的字体的大小
- ax1.set_ylabel("Ratio", fontsize='xx-large')
- ax1.set_ylim(0,0.8)
- # ----------
- # 绘制柱状图
- # ----------
- ax2 = ax1.twinx() # 次坐标
- w=1
- ax2.bar(x-w, hist1, width = 2*w, align='center', alpha=0.5)
- ax2.bar(x+w, hist2, width = 2*w, align='center', alpha=0.5)
- # 设置坐标轴的标签
- ax2.yaxis.set_tick_params(labelsize=15) # 设置y轴的字体的大小
- ax2.set_xticks(x) # 设置xticks出现的位置
- # 创建xticks
- xticksName = []
- for i in range(len(binRange)-1):
- xticksName = xticksName + ['{}<x<{}'.format(str(np.round(binRange[i],1)), str(np.round(binRange[i+1],1)))]
- ax1.set_xticklabels(xticksName)
- # 设置坐标轴名称
- ax2.set_ylabel("Count", fontsize='xx-large')
- # 设置标题
- ax2.set_title('The Distribution of Normal1 Data and Normal2 Data', fontsize='x-large')
- # 设置图例
- plt.legend(('Normal1','Nomral2'),fontsize = 'x-large', loc='upper right')
- plt.show()
上面绘制的效果如下图所示:
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
2021年4月28日 下午1:40 1F
赞赞!
2021年4月28日 下午1:41 2F
读完非常有收获,大赞!