我想得到一个直方图箱中包含的数据列表.我正在使用numpy和Matplotlib.我知道如何遍历数据并检查bin边缘.但是,我想对2D直方图这样做,而执行此操作的代码相当丑陋.numpy有没有任何结构可以让这更容易?
对于1D情况,我可以使用searchsorted().但逻辑并没有那么好,我真的不想在没有必要时对每个数据点进行二进制搜索.
大多数令人讨厌的逻辑是由于bin边界区域.所有区域都有这样的边界:[左边缘,右边缘].除了最后一个bin,它有一个像这样的区域:[left edge,right edge].
以下是1D案例的示例代码:
import numpy as np
data = [0, 0.5, 1.5, 1.5, 1.5, 2.5, 2.5, 2.5, 3]
hist, edges = np.histogram(data, bins=3)
print 'data =', data
print 'histogram =', hist
print 'edges =', edges
getbin = 2 #0, 1, or 2
print '---'
print 'alg 1:'
#for i in range(len(data)):
for d in data:
if d >= edges[getbin]:
if (getbin == len(edges)-2) or d < edges[getbin+1]:
print 'found:', d
#end if
#end if
#end for
print …
Run Code Online (Sandbox Code Playgroud) 我无法将直方图绘制为pdf(概率)
我希望所有部分的总和等于1的面积,这样就可以更容易地比较数据集.出于某种原因,每当我指定中断(默认值为4或其他任何可怕的内容)时,它不再希望将箱子绘制为概率,而是将箱子绘制为频率计数.
hist(data[,1], freq = FALSE, xlim = c(-1,1), breaks = 800)
Run Code Online (Sandbox Code Playgroud)
我该怎么改变这一行呢?我需要一个概率分布和大量的箱子.(我有600万个数据点)
这是在R帮助中,但我不知道如何覆盖它:
频率逻辑; 如果为TRUE,则直方图图形是频率的表示,结果的计数分量; 如果为FALSE,则绘制概率密度,分量密度(使得直方图的总面积为1).当且仅当间隔是等距的(并且未指定概率)时,默认为TRUE.
谢谢
编辑:详情
嗯所以我的情节高于1,如果这是一个概率,这是相当混乱的.我现在看看它与bin宽度有什么关系.我或多或少想要让每个垃圾箱价值1点,同时仍然有很多垃圾箱.换句话说,除非直接在1.0并且所有其他箱都是0.0,否则箱高度不应高于1.0.就像现在一样,我有一个箱子可以在15.0左右形成一个驼峰
编辑:bin @Dwin中%的高度:那么如何绘制概率?我意识到由于x轴上的单位,积分仍然会给我1.0,但这不是我想要的.假设我有100分,其中5分落入第一个分区,那个分区应该是.05高度.这就是我要的.我做错了还有另一种方法吗?
我知道我有多少分.有没有办法将频率直方图中的每个bin计数除以这个数?
我想创建以下直方图(见下图)取自"Think Stats"一书.但是,我无法将它们放在同一个地块上.每个DataFrame都有自己的子图.
我有以下代码:
import nsfg
import matplotlib.pyplot as plt
df = nsfg.ReadFemPreg()
preg = nsfg.ReadFemPreg()
live = preg[preg.outcome == 1]
first = live[live.birthord == 1]
others = live[live.birthord != 1]
#fig = plt.figure()
#ax1 = fig.add_subplot(111)
first.hist(column = 'prglngth', bins = 40, color = 'teal', \
alpha = 0.5)
others.hist(column = 'prglngth', bins = 40, color = 'blue', \
alpha = 0.5)
plt.show()
Run Code Online (Sandbox Code Playgroud)
当我使用ax = ax1时,上面的代码不起作用:pandas多个图不能作为组合,也不是这个例子做我需要的:使用pandas覆盖多个直方图.当我按原样使用代码时,它会创建两个带直方图的窗口.任何想法如何结合它们?
以下是我希望看到最终数字的示例:
我正在尝试匹配两个图像的直方图(在MATLAB中,这可以使用imhistmatch
).是否有标准Python库提供的等效函数?我看过OpenCV,scipy和numpy,但没有看到任何类似的功能.
我有一个有很多不同价值观的因素.如果执行summary(factor)
输出,则列出不同的值及其频率.像这样:
A B C D
3 3 1 5
Run Code Online (Sandbox Code Playgroud)
我想制作频率值的直方图,即X轴包含发生的不同频率,Y轴包含具有此特定频率的因子数.完成这样的事情的最佳方法是什么?
编辑:感谢下面的答案,我发现我能做的就是从表中得到频率因子,然后在表格中得到它,然后绘制图形,这看起来像(如果f
是因素):
plot(factor(table(f)))
Run Code Online (Sandbox Code Playgroud) 我想绘制一个平均值(平均值)的直方图(例如我们可以用蓝色粗线标记).
我尝试使用plot
命令来做,但即使我设置参数add=TRUE
它也不起作用.
是否有已知的算法+数据结构来维持动态直方图?
想象一下,我有一个数据流(x_1,w_1),(x_2,w_2),...其中x_t是双精度数,代表一些测量变量,w_t是相关权重.
我可以做明显的(伪python代码):
x0,xN = 0, 10
numbins = 100
hist = [(x0 + i * delta , 0) for i in xrange(numbins)]
def updateHistogram(x, w):
k = lookup(x, hist) #find the adequated bin where to put x
hist[k][1] += 1
Run Code Online (Sandbox Code Playgroud)
但是当我有连续的数据流时,我遇到了一些问题.我手头没有完整的数据集,我必须在数据收集之间检查直方图.而且我没有期望:
所以我想动态定义二进制文件.我可以做愚蠢的事情:
for x in data_stream:
data.append(x)
hist = make_histogram(data)
Run Code Online (Sandbox Code Playgroud)
但我想这会很快变慢......
如果所有权重等于我认为的事情之一就是将数据存储在排序数组中并以保持数组排序的方式插入新数据.这样我可以:
data = sortedarray();
for x in data_stream:
data.insert(x)
bins = [ data[int(i * data.size()/numbins)] for i in xrange(numbins)]
Run Code Online (Sandbox Code Playgroud)
并且每个bin中的计数等于所有bin的data.size()/ numbins.
我想不出在这方面包括权重的方法......有没有人有建议?(关于这样做的c ++库的知识也会受到欢迎).
编辑:(对于要求的澄清)
x_t是浮点数.要计算直方图,我必须将x所属的连续范围除以多个区间.所以我将有一个数字序列bin [0],bin …
我用matlab读取了一个图像
input = imread ('sample.jpeg');
Run Code Online (Sandbox Code Playgroud)
然后我做
imhist(input);
Run Code Online (Sandbox Code Playgroud)
它给出了这个错误:
??? Error using ==> iptcheckinput
Function IMHIST expected its first input, I or X, to be two-dimensional.
Error in ==> imhist>parse_inputs at 275
iptcheckinput(a, {'double','uint8','logical','uint16','int16','single'}, ...
Error in ==> imhist at 57
[a, n, isScaled, top, map] = parse_inputs(varargin{:});
Run Code Online (Sandbox Code Playgroud)
运行后size(input)
,我看到我的输入图像很大300x200x3
.我知道第三个维度是用于颜色通道,但有没有办法显示这个直方图?谢谢.
这实际上应该非常简单,但我很难找到解决这个问题的方法.
我在R中有两个非常简单的数字向量.我只是想用它们绘制直方图.但是我希望它们在同一个图表上.棘手的部分是R默认重叠这两个直方图.我希望这些垃圾箱可以简单地并排放置,这样我就可以更好地直观地显示数据.
基本上这就是我想要做的
我对R和统计计算语言一般都是新手,所以如果你能回答我令人沮丧的问题,我将不胜感激.
我正在尝试使用gnuplot从此数据文件中生成以下直方图集群,其中每个类别在数据文件中每年以单独的行表示:
# datafile
year category num_of_events
2011 "Category 1" 213
2011 "Category 2" 240
2011 "Category 3" 220
2012 "Category 1" 222
2012 "Category 2" 238
...
Run Code Online (Sandbox Code Playgroud)
但我不知道怎么做每个类别一行.如果有人知道如何使用gnuplot,我会很高兴.
更好的是如下所示的堆叠直方图集群,其中堆叠的子类别由数据文件中的单独列表示:
# datafile
year category num_of_events_for_A num_of_events_for_B
2011 "Category 1" 213 30
2011 "Category 2" 240 28
2011 "Category 3" 220 25
2012 "Category 1" 222 13
2012 "Category 2" 238 42
...
Run Code Online (Sandbox Code Playgroud)
非常感谢提前!