我想绘制一个简单的一维直方图,其中条形应遵循给定色图的颜色编码.
这是一个MWE:
import numpy as n
import matplotlib.pyplot as plt
# Random gaussian data.
Ntotal = 1000
data = 0.05 * n.random.randn(Ntotal) + 0.5
# This is the colormap I'd like to use.
cm = plt.cm.get_cmap('RdYlBu_r')
# Plot histogram.
n, bins, patches = plt.hist(data, 25, normed=1, color='green')
plt.show()
Run Code Online (Sandbox Code Playgroud)
输出这个:

green我希望这些列不是用于整个直方图的颜色,而是遵循由定义的颜色映射cm和颜色值给出的颜色编码bins.根据所选择的色彩图,这意味着接近于零(不在高度但在位置上)的箱应该看起来更蓝并且更接近一个更红RdYlBu_r.
由于plt.histo没有cmap参数,我不知道如何告诉它使用中定义的色彩映射cm.
我想使用Matplotlib在已经预先计数的数据上绘制直方图.例如,假设我有原始数据
data = [1, 2, 2, 3, 4, 5, 5, 5, 5, 6, 10]
Run Code Online (Sandbox Code Playgroud)
鉴于这些数据,我可以使用
pylab.hist(data, bins=[...])
Run Code Online (Sandbox Code Playgroud)
绘制直方图.
就我而言,数据已被预先计算并表示为字典:
counted_data = {1: 1, 2: 2, 3: 1, 4: 1, 5: 4, 6: 1, 10: 1}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想将这个预先计数的数据传递给直方图函数,让我可以控制箱宽,绘图范围等,就好像我已经将原始数据传递给它一样.作为一种解决方法,我将我的计数扩展到原始数据:
data = list(chain.from_iterable(repeat(value, count)
for (value, count) in counted_data.iteritems()))
Run Code Online (Sandbox Code Playgroud)
当counted_data包含数百万个数据点的计数时,这是低效的.
是否有更简单的方法使用Matplotlib从我预先计算的数据中生成直方图?
或者,如果最简单的条形图是预先装箱的数据,是否有一种方便的方法可以将我的每件商品计数"汇总"为分箱数量?
我的问题非常类似于将R ggplot中的直方图中的y轴标准化为比例,除了我有两组不同大小的数据,我希望每个比例相对于其组大小而不是总大小.
为了更清楚,假设我在数据框中有两组数据:
dataA<-rnorm(100,3,sd=2)
dataB<-rnorm(400,5,sd=3)
all<-data.frame(dataset=c(rep('A',length(dataA)),rep('B',length(dataB))),value=c(dataA,dataB))
Run Code Online (Sandbox Code Playgroud)
我可以将两个发行版一起绘制:
ggplot(all,aes(x=value,fill=dataset))+geom_histogram(alpha=0.5,position='identity',binwidth=0.5)
Run Code Online (Sandbox Code Playgroud)
而不是Y轴上的频率我可以有以下比例:
ggplot(all,aes(x=value,fill=dataset))+geom_histogram(aes(y=..count../sum(..count..)),alpha=0.5,position='identity',binwidth=0.5)
Run Code Online (Sandbox Code Playgroud)
但是这给出了相对于总数据大小的比例(这里是500分):是否有可能相对于每个组的大小?
我的目标是使得可以在视觉上比较A和B之间给定箱中的值的比例,而与它们各自的大小无关.也欢迎与我的原创不同的想法!
谢谢!
我使用以下方法制作堆积条形图:
DataFrame.plot(kind='bar',stacked=True)
Run Code Online (Sandbox Code Playgroud)
我想控制条的宽度,以便条形图像直方图一样相互连接.
我查看了文档,但无济于事 - 有什么建议吗?有可能这样做吗?
我想用NumPy创建一个CDF,我的代码是下一个:
histo = np.zeros(4096, dtype = np.int32)
for x in range(0, width):
for y in range(0, height):
histo[data[x][y]] += 1
q = 0
cdf = list()
for i in histo:
q = q + i
cdf.append(q)
Run Code Online (Sandbox Code Playgroud)
我正在走数组,但需要很长时间才能执行程序.有这个功能的内置功能,不是吗?
我是R.的新手.我需要生成一个具有累积频率和相对频率的简单频率表(如书中).
所以我想从一些简单的数据生成
> x
[1] 17 17 17 17 17 17 17 17 16 16 16 16 16 18 18 18 10 12 17 17 17 17 17 17 17 17 16 16 16 16 16 18 18 18 10
[36] 12 15 19 20 22 20 19 19 19
Run Code Online (Sandbox Code Playgroud)
像这样的表:
frequency cumulative relative
(9.99,11.7] 2 2 0.04545455
(11.7,13.4] 2 4 0.04545455
(13.4,15.1] 1 5 0.02272727
(15.1,16.9] 10 15 0.22727273
(16.9,18.6] 22 37 0.50000000
(18.6,20.3] 6 43 0.13636364
(20.3,22] 1 …Run Code Online (Sandbox Code Playgroud) 我创建了一个dictionary计算list每个键中一个键的出现次数,我现在想要绘制其内容的直方图.
这是我想要绘制的字典的内容:
{1: 27, 34: 1, 3: 72, 4: 62, 5: 33, 6: 36, 7: 20, 8: 12, 9: 9, 10: 6, 11: 5, 12: 8, 2: 74, 14: 4, 15: 3, 16: 1, 17: 1, 18: 1, 19: 1, 21: 1, 27: 2}
Run Code Online (Sandbox Code Playgroud)
到目前为止我写了这个:
import numpy as np
import matplotlib.pyplot as plt
pos = np.arange(len(myDictionary.keys()))
width = 1.0 # gives histogram aspect to the bar diagram
ax = plt.axes()
ax.set_xticks(pos + (width / 2))
ax.set_xticklabels(myDictionary.keys()) …Run Code Online (Sandbox Code Playgroud) 我有周期性数据,并且它的分布最好围绕一个圆圈可视化.现在的问题是如何使用matplotlib进行这种可视化?如果没有,可以在Python中轻松完成吗?
我的代码将演示围绕圆圈分布的粗略近似值:
from matplotlib import pyplot as plt
import numpy as np
#generatin random data
a=np.random.uniform(low=0,high=2*np.pi,size=50)
#real circle
b=np.linspace(0,2*np.pi,1000)
a=sorted(a)
plt.plot(np.sin(a)*0.5,np.cos(a)*0.5)
plt.plot(np.sin(b),np.cos(b))
plt.show()
Run Code Online (Sandbox Code Playgroud)

在SX for Mathematica的问题中有几个例子:

我正在绘制直方图,我有三个数据集,我想要一起绘制,每个数据集都有不同的颜色和线型(虚线,点线等).我也给了一些透明度,以便看到重叠的条形图.
关键是我希望每个条的边缘不会像内部部分那样变得透明.这是一个例子:
import matplotlib.pyplot as plt
import numpy as np
x = np.random.random(20)
y =np.random.random(20)
z= np.random.random(20)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.hist(x, bins=np.arange(0, 1, 0.1), ls='dashed', alpha = 0.5, lw=3, color= 'b')
ax.hist(y, bins=np.arange(0, 1, 0.1), ls='dotted', alpha = 0.5, lw=3, color= 'r')
ax.hist(z, bins=np.arange(0, 1, 0.1), alpha = 0.5, lw=3, color= 'k')
ax.set_xlim(-0.5, 1.5)
ax.set_ylim(0, 7)
plt.show()
Run Code Online (Sandbox Code Playgroud)

我有一个字符串列表:
a = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'e', 'e', 'e', 'e', 'e']
Run Code Online (Sandbox Code Playgroud)
我想制作一个直方图来显示字母的频率分布.我可以使用以下代码创建一个包含每个字母数的列表:
from itertools import groupby
b = [len(list(group)) for key, group in groupby(a)]
Run Code Online (Sandbox Code Playgroud)
如何制作直方图?我可能在列表中有一百万个这样的元素a.