哑铃图又名DNA图(图标横着看像哑铃,竖着看像DNA),主要用于展示两个数据点之间的变化。
哑铃图可以看作散点图与线形图的组合,适用于比较各种项目“前”与“后”的位置及项目的等级排序等场景。
下面作业为“2017年与2018年某公司各部门活动经费的使用情况”
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt # 导入绘图库
import matplotlib.lines as mlines
plt.rcParams['font.family']='SimHei' # 设置黑体字体以正常显示中文
plt.rcParams['axes.unicode_minus']=False # 正常显示负号
n = 5
ind_r = np.linspace(n-1,0,n) #ind_r = [4,3,2,1,0]
ind = np.linspace(0,n-1,n)
df = pd.read_excel('data.xlsx',sheet_name="哑铃图")
#df数据内容显示
#创建一个新的图形,设置大小为9x9单位
fig,ax = plt.subplots(1,1,figsize=(9,9))
#在图上绘制散点图,把点画出
ax.scatter(x=df[2017],y=ind_r,s=90,color='r',alpha=0.9,label='2017')
ax.scatter(x=df[2018],y=ind_r,s=90,color='b',alpha=0.9,label='2018')
#定义一个函数在绘制一条线从点p1到p2
def drawLine(p1,p2):
line = mlines.Line2D([p1[0],p2[0]],[p1[1],p2[1]],color='skyblue')
ax.add_line(line)
#对于每一个点,从ind_r、df[2017]和df[2018]中取值,并用drawLine函数绘制线
for i,p1,p2 in zip(ind_r,df[2017],df[2018]):
drawLine([p1,i],[p2,i])
#设置x轴范围为550-1050
ax.set_xlim(550,1050)
xt = range(600,1001,50) #创建一个x轴的刻度范围
ax.set_xticks(xt) #设置x轴的刻度位置
ax.set_xticklabels(['¥'+str(x)+'.00'for x in xt]) #设置x轴刻度标签格式
ax.set_ylim(-1,5) #设置y轴的范围为-1到5
ax.set_yticks([]) #设置y轴的刻度
#定义一个函数来设置特定位置的文本
def setText(i):
if df[2018][i] < df[2017][i]:
ax.text(df[2017][i]+10,ind[i*(-1)-1],str(df['department'][i])+'¥'+str(df[2017][i])+".00",color='k',fontsize=10)
ax.text(df[2018][i]-50,ind[i*(-1)-1],'¥'+str(df[2018][i])+".00",color='k',fontsize=10)
else:
ax.text(df[2017][i]-75,ind[i*(-1)-1],str(df['department'][i])+'¥'+str(df[2017][i])+".00",color='k',fontsize=10)
ax.text(df[2018][i]+10,ind[i*(-1)-1],'¥'+str(df[2018][i])+".00",color='k',fontsize=10)
#对于前5个点,设置文本
for i in range(5):
setText(i)
plt.legend(ncol=2) #显示图例,并设置列数为2
plt.show() #显示图形
#哑铃图效果显示