鱼C论坛

 找回密码
 立即注册
查看: 3223|回复: 19

[已解决]matplotlib中的条形图如何显示频数

[复制链接]
发表于 2019-3-21 09:42:10 | 显示全部楼层 |阅读模式

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

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

x
请问下,matplotlib中,我用条形图做数据的可视化处理。但是希望在条形图的上方显示相应的具体频数。。这个该怎么做??
最佳答案
2019-3-21 09:48:57
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. #创建带数字标签的直方图
  4. numbers = list(range(1,11))
  5. #np.array()将列表转换为存储单一数据类型的多维数组
  6. x = np.array(numbers)
  7. y = np.array([a**2 for a in numbers])
  8. plt.bar(x,y,width=0.5,align='center',color='c')
  9. plt.title('Square Numbers',fontsize=24)
  10. plt.xlabel('Value',fontsize=14)
  11. plt.ylabel('Square of Value',fontsize=14)
  12. plt.tick_params(axis='both',labelsize=14)
  13. plt.axis([0,11,0,110])
  14. for a,b in zip(x,y):
  15.     plt.text(a,b+0.1,'%.0f'%b,ha = 'center',va = 'bottom',fontsize=7)

  16. plt.show()
复制代码

回复了个被HX- -
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-21 09:48:21 | 显示全部楼层
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. #创建带数字标签的直方图
  4. numbers = list(range(1,11))
  5. #np.array()将列表转换为存储单一数据类型的多维数组
  6. x = np.array(numbers)
  7. y = np.array([a**2 for a in numbers])
  8. plt.bar(x,y,width=0.5,align='center',color='c')
  9. plt.title('Square Numbers',fontsize=24)
  10. plt.xlabel('Value',fontsize=14)
  11. plt.ylabel('Square of Value',fontsize=14)
  12. plt.tick_params(axis='both',labelsize=14)
  13. plt.axis([0,11,0,110])
  14. for a,b in zip(x,y):
  15.     plt.text(a,b+0.1,'%.0f'%b,ha = 'center',va = 'bottom',fontsize=7)

  16. plt.show()
复制代码

百度了个例子
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-21 09:48:57 | 显示全部楼层    本楼为最佳答案   
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. #创建带数字标签的直方图
  4. numbers = list(range(1,11))
  5. #np.array()将列表转换为存储单一数据类型的多维数组
  6. x = np.array(numbers)
  7. y = np.array([a**2 for a in numbers])
  8. plt.bar(x,y,width=0.5,align='center',color='c')
  9. plt.title('Square Numbers',fontsize=24)
  10. plt.xlabel('Value',fontsize=14)
  11. plt.ylabel('Square of Value',fontsize=14)
  12. plt.tick_params(axis='both',labelsize=14)
  13. plt.axis([0,11,0,110])
  14. for a,b in zip(x,y):
  15.     plt.text(a,b+0.1,'%.0f'%b,ha = 'center',va = 'bottom',fontsize=7)

  16. plt.show()
复制代码

回复了个被HX- -
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-21 10:50:40 | 显示全部楼层


1.png 2.png

我自己也试着改了下。。但是,发现个问题。。如果用for语句,同时做多组分类数据的话,有些分类数据是二分类,有些是多分类,则貌似无法对齐?
我也跟着你,设置了va='center', ha = 'bottom'。。貌似没用。。
另外,顺便问个事,plt.text的前面2个参数,是设置所显示频数的位置,后面又 设置va='center', ha = 'bottom',这个是否有冲突?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-21 10:57:08 | 显示全部楼层
你的m-0.03干嘛,水平人家给你设置好了,根据自己图形的y的位置调整你的文字位置,如果图片显示不下
plt.figure(figsize=(60,1))类似这样调整下你的图片尺寸
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-21 10:59:20 | 显示全部楼层

3.png

还个没懂的是,我用for语句进行循环,先print(i),想让每幅图出来前,打印下相应的变量名。。但是,不知道为什么,图没出来,这几个变量名,倒是都先打印出来了。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-21 11:01:20 | 显示全部楼层
figure是一次就够了,你放循环里干嘛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-21 11:04:00 | 显示全部楼层
塔利班 发表于 2019-3-21 11:01
figure是一次就够了,你放循环里干嘛

要放在循环里面啊。。
我这是有4组数据,要分别显示。。如果放外面,数据都放在一张图里显示了啊。
另外,我把m-0.03改成了m,最后一个多分类的数据显示还是有问题。。我也改了画布大小,仍旧是一样的问题。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-21 11:04:48 | 显示全部楼层
你把代码都贴出来,我这么看费劲
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-21 11:06:38 | 显示全部楼层
你这循环本来就是先打印了变量,你也没写显示图的语句
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-21 11:07:46 | 显示全部楼层
塔利班 发表于 2019-3-21 11:04
你把代码都贴出来,我这么看费劲
  1. for i in l_d:
  2.     plt.figure(figsize=[6,4])  #可视化前,需设置画布
  3.     print(i)
  4.     #plt.bar(data[i].unique(),data[i].value_counts(),width = 0.2
  5.     data[i].value_counts().plot.bar(width =0.1)  #将每个分类变量的数量进行可视化处理,查看分布情况
  6.     for m,n in zip(data[i].unique(),data[i].value_counts().sort_values()):  #sort_values进行降序处理(False)。改升序,则ascending= True
  7.         plt.text(m,n+1,n,fontsize =15,horizontalalignment='center',verticalalignment='bottom')
  8.     plt.title('%s的组成'%i)
  9.     plt.savefig('%s的组成.jpg'%i,dpi =1000)   #保存可视化图形
复制代码


问题在于,数据在我这里。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-21 11:10:55 | 显示全部楼层
本帖最后由 老笨啊 于 2019-3-21 11:13 编辑
塔利班 发表于 2019-3-21 11:06
你这循环本来就是先打印了变量,你也没写显示图的语句

  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. %matplotlib inline
  5. import re,os
复制代码


我在jupyter里编辑的,用%matplotlib inline的魔法方法,不用show命令,也可以显示图形。
不过你提醒了我,我增加了show命令,好像就可以了。。这个魔法方法应该是命令全部执行完,再执行的。
我在刚才的savefig命令后面,增加了show命令,就可以正常分开打印变量,显示图形了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-21 11:12:47 | 显示全部楼层
老笨啊 发表于 2019-3-21 11:10
我在jupyter里编辑的,用%matplotlib inline的魔法方法,不用show命令,也可以显示图形。
我的意思 ...

那你图片4个都出来了没,什么时候显示的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-21 11:15:11 | 显示全部楼层
塔利班 发表于 2019-3-21 11:12
那你图片4个都出来了没,什么时候显示的

我改好了。。谢谢你的提醒。。
用了魔法方法,虽然可以显示图形,但是是等所有命令执行完,才来显示图形的。
还是要加上show命令,才可以按正常的步骤执行显示。

不过还是那个多分类变量的数值显示,无法做到对齐。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-21 11:29:15 | 显示全部楼层
老笨啊 发表于 2019-3-21 11:15
我改好了。。谢谢你的提醒。。
用了魔法方法,虽然可以显示图形,但是是等所有命令执行完,才来显示图形 ...

对齐你把你自己增加、改变的参数好好看看,调整下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-21 11:36:04 | 显示全部楼层
塔利班 发表于 2019-3-21 11:29
对齐你把你自己增加、改变的参数好好看看,调整下

二分类的变量,我觉得没什么问题,对齐很好。。
但是多分类变量,就是对不齐。。
不知道是否因为分类数量的不一致,会导致这个问题。。

1.png 2.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-21 11:41:59 | 显示全部楼层
这个是你自己调试的事,我也没有数据,你就打印位置和实际值,看看到底哪个没对上,怎么跑的,这只能你自己分析
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-21 11:50:31 | 显示全部楼层
塔利班 发表于 2019-3-21 11:41
这个是你自己调试的事,我也没有数据,你就打印位置和实际值,看看到底哪个没对上,怎么跑的,这只能你自己 ...

嗯,好的。
我再试试。
真心十分感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-22 03:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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