matplotlib绘图优化–柱状图与折线图

  • A+
所属分类:python数据分析
摘要这一篇会介绍一下如何将柱状图与折线图绘制在一起,这里也是利用了绘制主次坐标图的思想。

简介

我们有的时候需要将柱状图与折线图绘制在一起。柱状图来表示数据的分布,折线图来表示某种特征的分布。

这里我们就简单介绍一下如何使用matplotlib来绘制将柱状图与折线图结合在一起的图像。这里我们也是会利用绘制主次坐标的方式,这个可以参考这个链接 : Python绘制主次坐标图

绘制方式

下面我们来详细讲一下绘制的过程与方法。我们会首先绘制折线图,接着使用ax2=ax1.twinx()来创建次坐标, 在次坐标上绘制折线图。

大体的过程如下面代码所示:

  1. # 创建数据
  2. rng = np.random.RandomState(10)
  3. data1 = rng.normal(size=1000)
  4. data2 = rng.normal(size=1000)
  5. # 创建分割
  6. binRange = np.arange(-4,4,1)
  7. hist1,_ = np.histogram(data1, bins=binRange)
  8. hist2,_ = np.histogram(data2, bins=binRange)
  9. ratio = hist2/(hist1+hist2) # 所占比例
  10. # 绘制图像
  11. fig, ax1 = plt.subplots()
  12. fig.set_size_inches(10, 6)
  13. plt.set_cmap('RdBu')
  14. x = np.arange(len(binRange)-1)*5
  15. # ----------
  16. # 绘制折线图
  17. # ----------
  18. ax1.plot(x, ratio, color='#1b71f1', linewidth=5, marker='o',  markersize=17, linestyle='dashed')
  19. ax1.plot([x[0]-5*w, x[-1]+5*w], [0.2, 0.2], color='navy', lw=10, linestyle='-', alpha=0.3) # 这是一条直线
  20. ax1.plot([x[0]-5*w, x[-1]+5*w], [0.2, 0.2], color='black', lw=1, linestyle='--', alpha=0.3) # 这是一条直线
  21. ax1.yaxis.set_tick_params(labelsize=15) # 设置y轴的字体的大小
  22. ax1.set_ylabel("Ratio", fontsize='xx-large')
  23. ax1.set_ylim(0,0.8)
  24. # ----------
  25. # 绘制柱状图
  26. # ----------
  27. ax2 = ax1.twinx() # 次坐标
  28. w=1
  29. ax2.bar(x-w, hist1, width = 2*w, align='center', alpha=0.5)
  30. ax2.bar(x+w, hist2, width = 2*w, align='center', alpha=0.5)
  31. # 设置坐标轴的标签
  32. ax2.yaxis.set_tick_params(labelsize=15) # 设置y轴的字体的大小
  33. ax2.set_xticks(x) # 设置xticks出现的位置
  34. # 创建xticks
  35. xticksName = []
  36. for i in range(len(binRange)-1):
  37.     xticksName = xticksName + ['{}<x<{}'.format(str(np.round(binRange[i],1)), str(np.round(binRange[i+1],1)))]
  38. ax1.set_xticklabels(xticksName)
  39. # 设置坐标轴名称
  40. ax2.set_ylabel("Count", fontsize='xx-large')
  41. # 设置标题
  42. ax2.set_title('The Distribution of Normal1 Data and Normal2 Data', fontsize='x-large')
  43. # 设置图例
  44. plt.legend(('Normal1','Nomral2'),fontsize = 'x-large', loc='upper right')
  45. plt.show()

上面绘制的效果如下图所示:

matplotlib绘图优化--柱状图与折线图
  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: