Python数据可视化:使用Matplotlib绘制棒棒糖图表详解
本文详细介绍如何使用Python的Matplotlib库绘制棒棒糖图表。通过对比传统条形图的局限性,演示了利用条形图结合散点图,以及使用折线图标记两端圆点两种方法优化图表视觉效果。文章涵盖颜色区分、线条粗细调整及坐标轴设置等关键参数,帮助读者掌握更清晰的数据展示技巧。
大家好,我是小F~
条形图的局限性与棒棒糖图表的优势
在数据可视化领域,条形图是一种极为常见的图表类型。
尽管其实用性高,但条形图也存在一定局限性。例如,当数据条目过多时,图表容易显得臃肿,导致信息传达不够直观。
棒棒糖图表正是对条形图的一种改进形式,它以简洁清新的设计风格,更清晰、直观地呈现数据信息。
基于条形图的棒棒糖图表绘制方法
接下来,小F将为大家演示如何使用Python绘制棒棒糖图表。
本例使用的数据为我国1949年至2019年历年的出生人口统计,数据来源为国家统计局。
首先,我们需要读取相关数据文件。
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
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: 条形图宽度 s: 散点图圆圈大小
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和各年份的具体数值作为起点和终点。
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
df = pd.read_csv('data.csv')
print(df)
# 新建画布
fig, ax = plt.subplots(1, figsize=(12, 8))
# 年份数
n = len(df)
# 颜色设置
colors = ['black'] + ((n-1)*['lightgrey'])
# 使用线条
for idx, val in df.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'])
# 使用线条, markersize设置标记点大小
for idx, val in df.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'])
# 使用线条
for idx, val in df.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'] = ['Songti SC']
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')
得到的结果如下。

黑色可能不是最佳选择,尝试更换其他颜色看看效果。
# 新建画布
fig, ax = plt.subplots(1, figsize=(12, 8))
# 年份数
n = len(df)
# 颜色设置
color = 'b'
colors = ['#E74C3C'] + ((len(df)-1)*['#F5B7B1'])
# 使用线条
for idx, val in df.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'] = ['Songti SC']
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')
更换颜色后的结果如下。

源码地址:
链接:https://pan.baidu.com/s/1vUgjonTOvgN7rDPx_8RfUg 密码:i613
现在,对于条形图,你有了另一个更好的选择,即棒棒糖图表。
此外,通过图表我们也可以了解到,目前中国的新出生人口数量呈现逐年减少的趋势。有说法称2020年出生人口降幅可能超过一成,未来几年恐跌破1000万……
以上就是如何用Python绘制棒棒糖图表的详细内容,更多关于用Python绘制棒棒糖图表的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













