如何用Python绘制棒棒糖图表
作者:法纳斯特 发布时间:2021-05-02 06:26:33
大家好,我是小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万...
来源:https://mp.weixin.qq.com/s/f5lAfAbsckiRwH9qfUox5A
猜你喜欢
- 引子如果遇到了 Must provide secret_key to use csrf错误提醒,原因就是没有设置secret_key ,在代
- 前言在机器学习中,我们会经常和矩阵打交道。在矩阵的运算中,python默认的输出是浮点数,但是如果我们想要矩阵的元素以分数的形式显示,可以通
- 如何用PYTHON制作填词游戏新建一个PYTHON文档。用JUPYTER NOTEBOOK打开即可。print("Heart is
- <html><head>//搜索暂时没做,数据是出来了,但是却没法显示<link rel="styl
- Python自动的os库是和操作系统交互的库,常用的操作包括文件/目录操作,路径操作,环境变量操作和执行系统命令等。文件/目录操作获取当前目
- 经常使用word办公的小伙伴们经常会遇到邮件合并的任务,通常会将数量有限的表格中的信息通过word的邮件合并功能,自动生成word文档,操作
- 不得不承认,傲游在用户体验方面是做得比较好的,所以它的用户群非常大。也正因为如此,它的某些不好的特性也造成了开发人员不可忽略的浏览器兼容问题
- 简介:使用python的过程中肯定少不了读取文件的操作,传统的形式是使用 直接打开、然后在操作、然后再关闭,这样代码量稍微大些不说,一旦在操
- 压缩数据库文件可以提高数据库的性能,但是有些时候在压缩数据库时,系统会提醒用户该数据库不能压缩。如果在Access数据库中删除数据库对象,或
- 加密算法分类 对称加密算法:对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥发送方和接收方需要持有同一把密钥,发送消息
- 本文实例讲述了Python3实现计算两个数组的交集算法。分享给大家供大家参考,具体如下:问题:给定两个数组,写一个方法来计算它们的交集。方案
- 啥也不说了,大家还是直接看图吧!补充知识:python http request header主要内容http request 请求头主要包
- 1.字符串处理将字符串中的数字替换成其两倍的值,例如:修改前:"AS7G123m (d)F77k"修改后:"A
- python中的列表和元组# 1.列表的格式# [数据1,数据2,数据3,···]# 列表 可变数据类型# 列表可以存储多个数据,数据之间的
- 一直以来都有这样一个困惑,那就是打开页面间的链接时是在原窗口转换还在新窗口打开呢?如果是在原窗口里转换页面的话,那我还想使用原页面的信息呢?
- 起源:.clearfix:after {visibility: hidden;display: block;font-size: 0;con
- 一、问题描述通过调用MyQR模块来实现生成个人所需二维码。安装:pip install myqr二、代码实现1.普通二维码from MyQR
- 一定要注重代码规范,按照平时的代码管理,可以将Python代码规范检测分为两种:静态本地检测:可以借助静态检查工具,比如:Flake8,Py
- 随着CSS3越来越热,CSS3动画也逐渐受到大家的关注。这次有幸修改淘宝网全站页头,小小地应用了下(详见http://www.taobao.
- 记忆点:前序:VLR中序:LVR后序:LRV举例:一颗二叉树如下图所示:则它的前序、中序、后序遍历流程如下图所示:1.前序遍历class S