鱼C论坛

 找回密码
 立即注册
查看: 2091|回复: 11

[已解决]matplotlib text加标签功能问题求助

[复制链接]
发表于 2020-8-3 13:36:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import pandas as pd
  2. import matplotlib.pyplot as plt

  3. df=pd.read_excel('2.xlsx').convert_dtypes()
  4. df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')
  5. df['date'] = df['date'].dt.date
  6. print(df.head())

  7. df.plot.bar(x='date',
  8.         y='时长')
  9. for i,j in enumerate(zip(df['date'],df['时长'])):
  10.     plt.text(i,j,j)

  11. plt.show()
复制代码


想在每个柱子上加上时长,具体见附件的图片
上述代码报错如下:
matplotlib.units.ConversionError: Failed to convert value(s) to axis units: (datetime.date(2020, 7, 1), 2)
求助:
应该如何写,才能加上标签,报错的问题如何解决?
最佳答案
2020-8-5 22:37:02
rsj0315 发表于 2020-8-5 20:33
是我理解错了么?
还是你没理解对呢?
现在问题是在柱子的上边加上时长。




我是说你报错大致解决方法啊 , 你帖子不是说了吗? 报错怎么解决,怎么还问起我来了
Capture.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-3 13:43:14 | 显示全部楼层

plt.text(x,y,text)  第一个参数和第二个参数分别是x、y 轴坐标,第三个是注释文本内容

你这个报错好像是因为直接用日期当成 x 轴,是不允许的,只能弄成 range() 之类的一个具体的坐标

matplotlib 柱状图问题
https://fishc.com.cn/thread-174641-1-1.html
(出处: 鱼C论坛)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-3 14:08:12 From FishC Mobile | 显示全部楼层
那接受什么格式呢?字符串?或者数值?还是只要放在列表中就可以呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-3 14:09:01 From FishC Mobile | 显示全部楼层
Twilight6 发表于 2020-8-3 13:43
plt.text(x,y,text)  第一个参数和第二个参数分别是x、y 轴坐标,第三个是注释文本内容

你这个报错好 ...

只要是列表里就可以吗?还是要求列表里的内容格式有要求?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-3 14:11:19 | 显示全部楼层
rsj0315 发表于 2020-8-3 14:09
只要是列表里就可以吗?还是要求列表里的内容格式有要求?


没尝试过小数,但是整数肯定可以,你用 plt.xticks 来设置月份信息,然后 x 轴实际刻度用 range 整数吧

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-3 15:54:23 | 显示全部楼层
Twilight6 发表于 2020-8-3 13:43
plt.text(x,y,text)  第一个参数和第二个参数分别是x、y 轴坐标,第三个是注释文本内容

你这个报错好 ...

正解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-3 19:13:14 From FishC Mobile | 显示全部楼层
Tip0 发表于 2020-8-3 15:54
正解

时间和数值是pandas读取的excel的,如何用range转换呢?
枚举的方法不行,是因为dtype的问题?还是什么呢?
搜半天不知道问题在哪里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-5 07:35:18 | 显示全部楼层
rsj0315 发表于 2020-8-3 19:13
时间和数值是pandas读取的excel的,如何用range转换呢?
枚举的方法不行,是因为dtype的问题?还是什么 ...


你读取出 date 的长度然后 range(len(date)) 你那个数据的长度用

  1. xlabel = [i for i in date]
  2. plt.xticks(rang(len(date)),xlabel)
复制代码


这样即可啊

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-5 20:33:50 | 显示全部楼层
Twilight6 发表于 2020-8-5 07:35
你读取出 date 的长度然后 range(len(date)) 你那个数据的长度用

是我理解错了么?
还是你没理解对呢?
现在问题是在柱子的上边加上时长。
for i,j in enumerate(zip(df['date'],df['时长'])):
    plt.text(i,j,j)
plt.text这里过不去。

x轴的xticks和xlabel按照你说的设置或者直接从dateframe里拿没问题的啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-5 22:37:02 | 显示全部楼层    本楼为最佳答案   
rsj0315 发表于 2020-8-5 20:33
是我理解错了么?
还是你没理解对呢?
现在问题是在柱子的上边加上时长。




我是说你报错大致解决方法啊 , 你帖子不是说了吗? 报错怎么解决,怎么还问起我来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-5 23:00:52 | 显示全部楼层
Twilight6 发表于 2020-8-5 22:37
我是说你报错大致解决方法啊 , 你帖子不是说了吗? 报错怎么解决,怎么还问起我来了

哦哦,了解,我以为答的是怎么把那数值加上去。
我找到方法了,明天有时间把代码放上去。
是借用了下numpy
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-5 23:15:06 | 显示全部楼层
  1. fig = plt.figure()
  2. #use a figure size of (20, 8),bar width of 0.8, 设置图片大小,柱宽
  3. #use color #5cb85c for the Very interested bars, 设置柱子颜色
  4. #color #5bc0de for the Somewhat interested bars,
  5. #color #d9534f for the Not interested bars,
  6. c=topicp.plot(kind='bar', y=['Very interested','Somewhat interested','Not interested'],figsize=(20, 8),width=0.8,
  7.            color=['#5cb85c','#5bc0de','#d9534f'],fontsize=14)
  8. #use font size 14 for the bar labels, percentages, and legend, 图例颜色
  9. plt.legend(fontsize=14)
  10. #use font size 16 for the title, and, 标题字号
  11. plt.title("Percentage of Respondents' Interest in Data Science Areas",fontsize=16)
  12. plt.yticks([]) # y轴空轴
  13. #display the percentages above the bars as shown above 数据标签列表
  14. x=np.arange(len(topicp.index))
  15. yv=np.array(list(topicp['Very interested']))
  16. ys=np.array(list(topicp['Somewhat interested']))
  17. yn=np.array(list(topicp['Not interested']))
  18. for a,b in zip(x,yv): ##控制标签位置
  19.     plt.text(a-0.27,b+0.1,'%.2f'%b,ha = 'center',va = 'bottom',fontsize=14)
  20. for a,b in zip(x,ys):
  21.     plt.text(a,b+0.1,'%.2f'%b,ha = 'center',va = 'bottom',fontsize=14)
  22. for a,b in zip(x,yn):
  23.     plt.text(a+0.27,b+0.1,'%.2f'%b,ha = 'center',va = 'bottom',fontsize=14)
  24. #remove the left, top, and right borders. 去掉图片边框
  25. c.spines['top'].set_visible(False)
  26. c.spines['right'].set_visible(False)
  27. #c.spines['bottom'].set_visible(False) 保留横坐标边框
  28. c.spines['left'].set_visible(False)
  29. plt.show
复制代码

https://blog.csdn.net/WallisY/article/details/98482700
用的连接中这个方法,可以实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 10:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表