当前位置: 首页 > 科技观察

用Python画棒棒糖图表真的很美!

时间:2023-03-22 01:10:57 科技观察

本文转载自微信公众号“Fanaster”,作者小F,转载请联系Fanaster公众号。大家好,我是小F~条形图是数据可视化中经常用到的图表。虽然它运作良好,但它确实有缺陷。例如,条形图条目过多时,会显得臃肿,不够直观。棒棒糖图是对条形图的改进,用小而清新的设计将我们的数据清晰的表达出来。下面小F就给大家介绍一下如何使用Python绘制棒棒糖图表。使用的是我国1949年到2019年历年的出生人口数据,数据来自国家统计局。首先读取数据。importpandasaspdimportmatplotlib.pyplotasplt#读取数据df=pd.read_csv('data.csv')print(df)结果如下。数据集很简单,每一行只有一年和一个值。首先绘制一个包含每年值的条形图。#画柱状图plt.bar(df.Year,df.value)plt.show()两行代码,就可以得到柱状图,看起来有点拥挤。去年,即2019年的数据,区分如下。将2019年的条形图涂成黑色,将其他年份涂成浅灰色。在图表中添加散点图会在条形图的顶部绘制圆圈。#新画布fig,ax=plt.subplots(1,figsize=(12,8))#年数n=len(df)#颜色设置colors=['black']+((n-1)*['lightgrey'])plt.bar(df.Year,df.value,color=colors)plt.scatter(df.Year,df.value,color=colors)plt.show()结果如下。颜色修改成功,需要调整条形图的宽度和顶部圆圈的大小。#width:barwidths:散点图圆大小plt.bar(df.Year,df.value,color=colors,width=0.2)plt.scatter(df.Year,df.value,color=colors,s=10)plt.show()的结果如下。和之前的蓝条图相比,棒棒糖图确实好很多。除了使用条形图来绘制棒棒糖图表,您还可以使用线条,这样整体宽度会更加一致。X以Year(年)数据为起点和终点,Y以-20和每一年的数据为起点和终点。importpandasaspdimportmatplotlib.pyplotasplt#读取数据df=pd.read_csv('data.csv')print(df)#新建画布fig,ax=plt.subplots(1,figsize=(12,8))#年数n=len(df)#颜色设置colors=['black']+((n-1)*['lightgrey'])#idx使用lines,valindf.iterrows():plt.plot([val.Year,val.Year],[-20,val.value],color=colors[idx])plt.show()得到如下结果。参数标记可用于在两端绘制圆圈,而不仅仅是在顶部生成散点图。然后可以通过更改y-limit参数隐藏最底部的圆。#新画布fig,ax=plt.subplots(1,figsize=(12,8))#年数n=len(df)#颜色设置colors=['black']+((n-1)*['lightgrey'])#使用lines,markersize设置标记大小foridx,valindf.iterrows():plt.plot([val.Year,val.Year],[-20,val.value],color=colors[idx],marker='o',markersize=3)#设置y轴的最小值plt.ylim(0,)plt.show()的结果如下。此外,您还可以调整lw、markersize参数,定义线的粗细和标记的大小,甚至可以绘制两次线以创建轮廓效果。#新画布fig,ax=plt.subplots(1,figsize=(12,8))color='b'#年数n=len(df)#颜色设置colors=['black']+((n-1)*['lightgrey'])#使用idx,valindf.iterrows():plt.plot([val.Year,val.Year],[-20,val.value],color='black',marker='o',lw=4,markersize=6)plt.plot([val.Year,val.Year],[-20,val.value],color=colors[idx],marker='o',markersize=4)#去掉上下边框ax.spines['right'].set_visible(False)ax.spines['top'].set_visible(False)#设置x轴和y轴范围plt.xlim(1948,2020)plt.ylim(0,)#中文显示plt.rcParams['font.sans-serif']=['SongtiSC']plt.title('中国历年出生人口数据(万)',loc='left',fontsize=16)plt.text(2019,-220,'来源:国家统计局',ha='right')#2019年出生人数(显示)value_2019=df[df['年份']==2019].value.values[0]plt.text(2019,value_2019+80,value_2019,ha='center')#保存图片plt.savefig('chart.png')得到如下结果。黑色不是特别好看,换个颜色试试。#新画布fig,ax=plt.subplots(1,figsize=(12,8))#年数n=len(df)#颜色设置color='b'colors=['#E74C3C']+((len(df)-1)*['#F5B7B1'])#用lineforidx,valindf.iterrows():plt.plot([val.Year,val.Year],[-20,val.value],color=colors[idx],marker='o',lw=4,markersize=6,markerfacecolor='#E74C3C')#去除上下边框ax.spines['right'].set_visible(False)ax.spines['top'].set_visible(False)#设置x轴和y轴范围plt.xlim(1948,2020)plt.ylim(0,)#中文显示plt.rcParams['font.sans-serif']=['SongtiSC']plt.title('中国历年出生人口数据(万)',loc='left',fontsize=16)plt.text(2019,-220,'来源:国家统计局',ha='right')#2019年出生人数(显示)value_2019=df[df['Year']==2019].value.values[0]plt.text(2019,value_2019+80,value_2019,ha='center')#保存图片plt.savefig('chart.png')得到结果如下。现在对于条形图,您有另一种选择,棒棒糖图。此外,我们还可以了解到,中国的新生儿数量正在减少。据称,2020年新生儿数量可能下降10%以上,未来几年可能跌破1000万……