当前位置: 首页 > 知识库问答 >
问题:

将matplotlib直方图除以最大仓位值

严扬
2023-03-14

我想在同一个图上绘制多个直方图,我需要比较数据的分布。我想用每个直方图除以它的最大值,这样所有分布都有相同的比例。然而,根据matplotlib的直方图函数的工作方式,我还没有找到一种简单的方法来实现这一点。

这是因为n在

n, bins, patches = ax1.hist(y, bins = 20, histtype = 'step', color = 'k')

是计数的数量在每个箱,但我不能重传这到hist,因为它将重新计算。

我尝试了范数和密度函数,但这些函数使分布的面积正常化,而不是分布的高度。我可以复制n,然后使用箱输出重复箱边,但这很乏味。当然,hist函数必须允许bins值除以常量?

下面是示例代码,演示了这个问题。

y1 = np.random.randn(100)
y2 = 2*np.random.randn(50)
x1 = np.linspace(1,101,100)
x2 = np.linspace(1,51,50)
gs = plt.GridSpec(1,2, wspace = 0, width_ratios = [3,1])
ax = plt.subplot(gs[0])
ax1 = plt.subplot(gs[1])
ax1.yaxis.set_ticklabels([])   # remove the major ticks

ax.scatter(x1, y1, marker='+',color = 'k')#, c=SNR, cmap=plt.cm.Greys)
ax.scatter(x2, y2, marker='o',color = 'k')#, c=SNR, cmap=plt.cm.Greys)
n1, bins1, patches1 = ax1.hist(y1, bins = 20, histtype = 'step', color = 'k',linewidth = 2, orientation = 'horizontal')
n2, bins2, patched2 = ax1.hist(y2, bins = 20, histtype = 'step', linestyle = 'dashed', color = 'k', orientation = 'horizontal')

共有3个答案

梁烨
2023-03-14

为比较而设置的略有不同的方法。可以适应步骤样式:

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np

y = []
y.append(np.random.normal(2, 2, size=40))
y.append(np.random.normal(3, 1.5, size=40))
y.append(np.random.normal(4,4,size=40))
ls = ['dashed','dotted','solid']

fig, (ax1, ax2, ax3) = plt.subplots(ncols=3)
for l, data in zip(ls, y):
    n, b, p = ax1.hist(data, normed=False,
                       #histtype='step', #step's too much of a pain to get the bins
                       #color='k', linestyle=l,
                       alpha=0.2
                       )
    ax2.hist(data, normed=True,
             #histtype = 'step', color='k', linestyle=l,
             alpha=0.2
             )

    n, b, p = ax3.hist(data, normed=False,
                       #histtype='step', #step's too much of a pain to get the bins
                       #color='k', linestyle=l,
                       alpha=0.2
                       )
    high = float(max([r.get_height() for r in p]))
    for r in p:
        r.set_height(r.get_height()/high)
        ax3.add_patch(r)
    ax3.set_ylim(0,1)

ax1.set_title('hist')
ax2.set_title('area==1')
ax3.set_title('fix height')
plt.show()

一对输出:

微生新翰
2023-03-14

您可以将参数bin指定为一个值列表。使用np。arange()np。linspace()生成值。http://matplotlib.org/api/axes_api.html?highlight=hist#matplotlib.axes.Axes.hist

公孙茂学
2023-03-14

我不知道matplotlib是否默认允许这种正常化,但我自己写了一个函数来实现。

它从plt获取nbin的输出。hist(如上所述),然后通过下面的函数传递此信息。

def hist_norm_height(n,bins,const):
    ''' Function to normalise bin height by a constant. 
        Needs n and bins from np.histogram or ax.hist.'''

    n = np.repeat(n,2)
    n = float32(n) / const
    new_bins = [bins[0]]
    new_bins.extend(np.repeat(bins[1:],2))
    return n,new_bins[:-1]

现在绘制(我喜欢步骤直方图),将其传递给plt.step.

例如plt。步骤(新的容器,n)。这将为您提供一个直方图,其中高度由一个常量标准化。

 类似资料:
  • 直方图(Histogram),又称质量分布图,它是一种条形图的一种,由一系列高度不等的纵向线段来表示数据分布的情况。 直方图的横轴表示数据类型,纵轴表示分布情况。 首先,我们需要了解柱状图和直方图的区别。直方图用于概率分布,它显示了一组数值序列在给定的数值范围内出现的概率;而柱状图则用于展示各个类别的频数。 例如,我们对某工厂的员工年龄做直方图统计,首先我们要统计出每一位员工的年龄,然后设定一个

  • 问题内容: 我正在使用matplotlib制作直方图。 有什么方法可以手动设置垃圾箱的大小,而不是垃圾箱的数量吗? 问题答案: 实际上,这很简单:您可以提供一个带有bin边界的列表,而不是bin的数量。它们也可能分布不均: 如果只希望它们均匀分布,则可以使用range: 添加到原始答案 上一行仅适用于整数填充。正如macrocosme所指出的,对于浮点数,您可以使用:

  • 我试图创建一个覆盖三个独立数据集的二维直方图。我的想法是给数据集涂上红色、绿色和蓝色的颜色,这样垃圾箱中红色数据的密度就对应于该垃圾箱颜色的红色值,蓝色和绿色也是如此。 有这样的例子,但据我所知,matplotlib中没有多色打印的实现。 进入表格的网格 完全没问题。问题是,我发现的所有绘图函数都希望将单个垃圾箱值映射到色阶上,它们不允许我设置垃圾箱的全部颜色值。 我应该找一些原始的吗?是否已经有

  • 我使用matplotlib创建直方图。仍然有一些问题我自己或借助互联网无法解决。 > 如何更改某些垃圾箱的颜色?详细地说,我想用:a.)value bin更改箱子的颜色 如何不仅用1个小数点的数字标记X轴,而且用2个小数点标记X轴(现在只是不打印)? 请参见下面绘制的柱状图: plt。迄今为止的直方图

  • 我有一个从sql数据库查询派生的直方图。代码如下: 输出如下:https://gyazo.com/d73b20a118db0088aab261c079613b00 我想显示为:https://gyazo.com/063990cd8741682f45b5a37ba594ff56 其中,x轴的编号向右侧移动了一点。有可能做到这一点吗?

  • NumPy有一个numpy.histogram()函数,它是数据频率分布的图形表示。 相等水平尺寸的矩形对应于称为bin类间隔和对应于频率的variable height 。 numpy.histogram() numpy.histogram()函数将输入数组和bin作为两个参数。 bin数组中的连续元素充当每个bin的边界。 import numpy as np a = np.array([2