用python画出和excel一样的折线图加柱状图用多种线条和柱的颜色
用python写分析代码的朋友说因为excel的图比较好看,所以没有用python,用了excel画图,我觉得已经用了Python,再调用excel画图比较麻烦,就觉得应该可以画出和excel一样的图出来,所以就试了下。
excel画的原图为:(由于数据保密,所以用了随机数生成的图)
excel画的图确实好看,而又有颜色区分,线条也有区分。不过我觉得python是一定能画出来这种图的,毕竟是开源,什么样式都可以调整。
研究了一下,没有找到可以将折线平滑的代码,有点打脸,不过,觉得还是比较有用的。
代码如下:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
#折线图叠加柱状图,所以是两个轴
fig, ax1 = plt.subplots(figsize=(15,10))
#数据传进去是数据框格式有三列,month,count,ratio
x=np.arange(len(df))
#这里count=df[count],下面month,ratio同理
y=np.array(list(count))
xticks1=list(month)
#前6个和后面不一样的柱体颜色,还可以参考这个画图包源码进行样式调整
plt.bar(x[0:6],y[0:6],width = 0.45,align='center',color = 'gray',alpha=0.9)
plt.bar(x[6:],y[6:],width = 0.45,align='center',color = 'c',alpha=0.9)
plt.xticks(x,xticks1,size='medium')
#在柱体上标记数值,这里取b=50,保持同一个水平位置,也可以就写b,显示的就是数值在柱的顶端显示
#即plt.text(a, b, '%.0f' % b, ha='center', va= 'bottom',fontsize=10)
for a,b in zip(x,y):
plt.text(a, 50, '%.0f' % b, ha='center', va= 'bottom',fontsize=10)
#画折线图
ax2 = ax1.twinx()
z=np.array(list(ratio))
ax2.plot(x[0:6],z[0:6],c='y',marker='o')
ax2.plot(x[5:],z[5:],c='y',linestyle='--',marker='o')
for a,b in zip(x,z):
plt.text(a, b, '%.2f%%' % (b*100), ha='center', va= 'bottom',fontsize=10)
plt.show()
最后画出的图像就是:
有几个问题没有解决:
1.没找到可以将折线图像excel那样平滑的办法
2.网格线的控制,我可以设置想显示x轴的网格线,但是两个X轴不是对齐的,excel里是对齐的之前用seaborn画图也是没有解决的问题,,现在又遇到了,仍然需要考虑
最后,图表的图例,标题什么的比较简单就没加了。