将numpy数组绘制成直方图

5
我有以下代码,用来将numpy数组绘制成直方图。但是我最终只得到一个框。
from sys import argv as a
import numpy as np
import matplotlib.pyplot as plt

r = list(map(int, (a[1], a[2], a[3], a[4], a[5])))
s = np.array([int((x - min(r))/(max(r) - min(r)) * 10) for x in r])
plt.hist(s, normed=True, bins=5)
plt.show()

程序使用以下输入运行 22 43 11 34 26

如何得到一个直方图,其中y轴代表列表元素的高度。


"normed"参数在Matplotlib 2.1版中已被弃用,将在3.1版中删除。请使用"density"参数代替。 - qqqqq
3个回答

12
您可以使用plt.bar:
plt.bar(np.arange(len(s)),s)
plt.show()

它会变成以下内容。这是你期望的输出吗?

在此输入图片描述


4

你无法获得以 y 轴表示列表元素值的直方图。

根据定义,直方图给出落入某些箱子中的元素数量,或在某个箱子中找到元素的概率。plt.hist 是绘制此类直方图的绘图函数。

因此,当您调用 plt.hist(s, normed=True, bins=5) 时,归一化输入数组 s = [3, 10, 0, 7, 4] 被分成0到10之间的5个箱子。每个箱子中恰好有一个来自 s 的数字,因此直方图中的所有条形都具有相同的高度。

enter image description here

在这种情况下,您实际上并不想要直方图,而只是值的条形图,因此应使用 plt.bar 与数组 s 作为高度参数以及某个索引作为位置。

from __future__ import division
import numpy as np
import matplotlib.pyplot as plt

a = ["some file", "22", "43", "11","34", "26"]

r = list(map(int, (a[1], a[2], a[3], a[4], a[5])))
s = np.array([int((x - min(r))/(max(r) - min(r)) * 10) for x in r])

plt.bar(np.arange(len(s)), s)
plt.show()

enter image description here


有没有可能不使用matplotlib和numpy,只用纯Python来完成这个任务? - Melissa Stewart
1
这是一个问题吗?如果是的话,我会说,理论上是可能的,但编写代码需要4天的时间。像matplotlib和numpy这样的库的好处是,您不需要关心一些基础知识,因此代码非常简短。当然,还有其他用于统计和绘图的库可供选择,您也可以使用它们。 - ImportanceOfBeingErnest
谢谢!我也有同样的问题,这个帮了我。 - DonCarleone

0

2
虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Yunnosch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接