我正在尝试使用matplotlib.hist()
函数绘制直方图,但我不知道该怎么做。
我有一个清单
probability = [0.3602150537634409, 0.42028985507246375,
0.373117033603708, 0.36813186813186816, 0.32517482517482516,
0.4175257731958763, 0.41025641025641024, 0.39408866995073893,
0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327,
0.35398230088495575]
和名单(字符串)。
如何将概率作为每个条形码的y值和名称作为x值?
答案 0 :(得分:88)
如果你想要一个直方图,你不需要将任何'名字'附加到x值,就像在x轴上你会有二进制文件:
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
x = np.random.normal(size = 1000)
plt.hist(x, normed=True, bins=30)
plt.ylabel('Probability');
但是,如果数据点数量有限,并且需要条形图,则可以将标签附加到x轴:
x = np.arange(3)
plt.bar(x, height= [1,2,3])
plt.xticks(x+.5, ['a','b','c'])
如果这可以解决您的问题,请告诉我。
编辑2018年11月26日
根据下面的评论,下面的代码就足够了Matplotlib 3.0.2:
x = np.arange(3)
plt.bar(x, height= [1,2,3])
plt.xticks(x, ['a','b','c']) # no need to add .5 anymore
编辑2019年5月23日
就直方图而言,不推荐使用normed
param:
MatplotlibDeprecationWarning:'normed'kwarg在Matplotlib 2.1中已弃用,将在3.1中删除。请改用“密度”。
所以,从Matplolib 3.1
代替:
plt.hist(x, normed=True, bins=30)
必须写:
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
x = np.random.normal(size = 1000)
plt.hist(x, density=True, bins=30) # density
plt.ylabel('Probability');
答案 1 :(得分:12)
如果您还没有安装matplotlib,只需尝试命令。
> pip install matplotlib
import matplotlib.pyplot as plot
plot.hist(weightList,density=1, bins=20)
plot.axis([50, 110, 0, 0.06])
#axis([xmin,xmax,ymin,ymax])
plot.xlabel('Weight')
plot.ylabel('Probability')
plot.show()
答案 2 :(得分:10)
尽管问题似乎要求使用matplotlib.hist()
函数绘制直方图,但可以使用问题的后半部分使用给定的概率作为直方图的y值来解决问题并给定名称(字符串)作为x值。
我假设样本名称列表对应于绘制曲线的给定概率。一个简单的条形图可以解决给定问题。可以使用以下代码:
import matplotlib.pyplot as plt
probability = [0.3602150537634409, 0.42028985507246375,
0.373117033603708, 0.36813186813186816, 0.32517482517482516,
0.4175257731958763, 0.41025641025641024, 0.39408866995073893,
0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327,
0.35398230088495575]
names = ['name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7', 'name8', 'name9',
'name10', 'name11', 'name12', 'name13'] #sample names
plt.bar(names, probability)
plt.xticks(names)
plt.yticks(probability) #This may be included or excluded as per need
plt.xlabel('Names')
plt.ylabel('Probability')
答案 3 :(得分:5)
这是一个古老的问题,但是以前的答案都没有解决真正的问题,即问题出在问题本身。
首先,如果已经计算出概率,即直方图聚合数据可以通过归一化的方式获得,则这些概率应加起来为1。数据或问题的方式。
第二,提供标签(而不是间隔)的事实通常意味着概率是分类响应变量的,并且最好使用条形图来绘制直方图(或者对pyplot的历史进行一些修改)方法),Shayan Shafiq的答案提供了代码。
但是,请参阅问题1,这些概率是不正确的,并且在这种情况下使用条形图作为“直方图”将是错误的,因为由于某种原因,它不能讲述单变量分布的故事(也许这些类是重叠的并且观察到的)是多次计数?),在这种情况下,这种图不应称为直方图。
直方图根据定义是单变量变量分布的图形表示形式(请参见https://www.itl.nist.gov/div898/handbook/eda/section3/histogra.htm,https://en.wikipedia.org/wiki/Histogram),它是通过绘制尺寸条来创建的,该尺寸条表示变量的选定类别中观察次数或频率出于兴趣。如果变量以连续刻度进行测量,则这些类别为箱(间隔)。直方图创建过程的重要部分是选择如何对分类变量的响应类别进行分组(或保持不分组),或者如何将可能值的域划分为连续的区间(在其中放置bin边界)类型变量。所有观察结果都应表示出来,并且每个图中只能观察一次。这意味着条形尺寸的总和应等于观察的总数(或宽度可变的情况下其面积,这是一种较不常用的方法)。或者,如果直方图已归一化,则所有概率之和必须等于1。
如果数据本身是作为响应的“概率”列表,即观察值是每个研究对象的(某物的)概率值,则最佳答案就是plt.hist(probability)
,并可能带有分箱选项,并且使用已有的x标签是可疑的。
然后,柱状图不应用作直方图,而应简单地用作
import matplotlib.pyplot as plt
probability = [0.3602150537634409, 0.42028985507246375,
0.373117033603708, 0.36813186813186816, 0.32517482517482516,
0.4175257731958763, 0.41025641025641024, 0.39408866995073893,
0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327,
0.35398230088495575]
plt.hist(probability)
plt.show()
结果
在这种情况下,matplotlib默认带有以下直方图值
(array([1., 1., 1., 1., 1., 2., 0., 2., 0., 4.]),
array([0.31308411, 0.32380469, 0.33452526, 0.34524584, 0.35596641,
0.36668698, 0.37740756, 0.38812813, 0.39884871, 0.40956928,
0.42028986]),
<a list of 10 Patch objects>)
结果是一个数组元组,第一个数组包含观察计数,即将相对于图的y轴显示的值(它们总计为13,观察总数),第二个数组是间隔x轴的边界。
一个人可以检查它们是否等距
x = plt.hist(probability)[1]
for left, right in zip(x[:-1], x[1:]):
print(left, right, right-left)
或者,例如,对于3个bin(我的判断是需要13个观测值),一个将获得此直方图
plt.hist(probability, bins=3)
情节数据位于“酒吧后面”
问题的作者需要澄清“概率”值列表的含义-“概率”仅仅是响应变量的名称(然后为什么要准备直方图的x标签,列表值是没有意义的),还是列表值是根据数据计算出的概率(因此,它们之和不等于1的事实是没有意义的。)
答案 4 :(得分:2)
这是一种非常圆润的方法,但是如果你想要制作直方图,你已经知道了bin值但没有源数据,你可以使用np.random.randint
函数生成正确的用于绘制hist函数的每个bin的范围内的值的数量,例如:
import numpy as np
import matplotlib.pyplot as plt
data = [np.random.randint(0, 9, *desired y value*), np.random.randint(10, 19, *desired y value*), etc..]
plt.hist(data, histtype='stepfilled', bins=[0, 10, etc..])
对于标签,你可以将x刻度与bins对齐得到类似的东西:
#The following will align labels to the center of each bar with bin intervals of 10
plt.xticks([5, 15, etc.. ], ['Label 1', 'Label 2', etc.. ])