9周课后T1 课本P166图8-7哑铃图

哑铃图又名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()           #显示图形

#哑铃图效果显示

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值