# 绘制哑铃图
# 哑铃图又名 DNA 图(图表横着看像哑铃,竖着看像 DNA),主要用于展示两个数据点之间的变化。哑铃图可以看作散点图与线形图的组合,适用于比较各种项目 “前” 与 “后” 的位置及项目的等级排序等场景。例如,2017 年与 2018 年某公司各部门活动经费的使用情况如图 8-7 所示。
已知美国在 2013 年和 2014 年分别对部分城市的人口 PCT 指标进行了统计,并将统计的结果整理到 health.xlsx 文件中。health.xlsx 文件的内容如图 8-8 所示。
# 下面使用 pandas 读取 health.xlsx 文件的数据,并根据读取的数据绘制由散点和线组成的哑铃图,示例代码如下。
In [4]:
import pandas as pd
import matplotlib.pyplot as plt
import inatplotlib.lines as mlines
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel(r"C:\Users\admin\Desktop\health.xlsx")
df.sort_values('pct_2014', inplace=True)
df.reset_index(inplace=True)
df = df.sort_values(by="index")
def newline(p1, p2, color='black'):
ax = plt.gca() # 获取当前的绘图区域
l = mlines.Line2D([p1[0], p2[0]], [p1[1], p2[1]], color='skyblue')
ax.add_line(l)
return l
fig, ax = plt.subplots(1, 1, figsize=(8, 6))
# 绘制散点
ax,scatter(y=df['index'], x=df['pct_2013'], s=50,
color='#0e668b', alpha=0.7)
ax.scatter(y=df['index'], x=df['pct_2014'], s=50,
color='#a3c4dc', alpha=0.7)
# 绘制线条
for i, p1, p2 in zip(df['index'], df['pct_2013'], df['pct_2014']):
newline([p1, i], [p2, i])
ax.set_title("2013 年与 2014 年美国部分城市人口 PCT 指标的变化率",fontdict=('size':12))
ax.set_xlim(0, .25)
ax.set_xticks([.05, .1, .15, .20])
ax.set_xticklabels(['5%', '10%', '15%', '20%'])
ax.set_xlabel('变化率')
ax.set_yticks(df['index'])
ax.set_yticklabels(df['city'])
ax.grid(alpha=0.5, axis='x')
plt.show()