限定箱宽度/ x轴刻度在Matplotlib直方图(Defining bin width/x-axi

2019-06-27 12:46发布

我生成与matplotlib直方图。

我需要的垃圾箱是不平等的宽度为我在垃圾箱最低最感兴趣。 现在我这样做:

plt.hist(hits_array, bins = (range(0,50,10) + range(50,550,50)))

这产生我想要的(第一箱5具有10的宽度,50的其余部分),但前五个二进制位,当然,窄于后者的,因为所有的二进制位被显示在同一轴线上。

有没有办法来影响x轴或直方图本身,所以我可以在前5个箱后突破尺度,让所有的垃圾箱都显示为同样广泛的?

(我知道这将创建一个扭曲的看法,和我很好,虽然我不介意有点轴的两个不同比例部分之间的空间。)

任何帮助将不胜感激。 谢谢!

Answer 1:

您可以使用bar ,也没有需要分割线。 下面是一个例子,

import matplotlib.pylab as plt
import numpy as np

data = np.hstack((np.random.rand(1000)*50,np.random.rand(100)*500))
binwidth1,binwidth2=10,50
bins=range(0,50,binwidth1)+range(50,550,binwidth2)

fig,(ax) = plt.subplots(1, 1)

y,binEdges=np.histogram(data,bins=bins)

ax.bar(0.5*(binEdges[1:]+binEdges[:-1])[:5], y[:5],width=.8*binwidth1,align='center')
ax.bar(0.5*(binEdges[1:]+binEdges[:-1])[5:], y[5:],width=.8*binwidth1,align='center')
plt.show()

如果你真的想分裂轴看看这里 。



Answer 2:

我在这里也有类似的问题,答案是使用一个肮脏的黑客。 Matplotlib直方图收集箱的高值

所以,用下面的代码,你得到的丑陋直方图你已经离开。

def plot_histogram_04():
    limit1, limit2 = 50, 550
    binwidth1, binwidth2 = 10, 50    
    data = np.hstack((np.random.rand(1000) * limit1, np.random.rand(100) * limit2))

    bins = range(0, limit1, binwidth1) + range(limit1, limit2, binwidth2)

    plt.subplots(1, 1)
    plt.hist(data, bins=bins)
    plt.savefig('my_plot_04.png')
    plt.close()

为了使箱等宽,你真的必须让他们等宽! 这意味着操纵数据,以便它们都落在以相等宽度的帧,然后玩的xlabel。

def plot_histogram_05():
    limit1, limit2 = 50, 550
    binwidth1, binwidth2 = 10, 50

    data = np.hstack((np.random.rand(1000) * limit1, np.random.rand(100) * limit2))

    orig_bins = range(0, limit1, binwidth1) + range(limit1, limit2 + binwidth2, binwidth2)
    data = [(i - limit1) / (binwidth2 / binwidth1) + limit1 
            if i >= limit1 else i for i in data]
    bins = range(0, limit2 / (binwidth2 / binwidth1) + limit1, binwidth1)

    _, ax = plt.subplots(1, 1)
    plt.hist(data, bins=bins)

    xlabels = np.array(orig_bins, dtype='|S3')
    N_labels = len(xlabels)
    print xlabels
    print bins
    plt.xlim([0, bins[-1]])
    plt.xticks(binwidth1 * np.arange(N_labels))
    ax.set_xticklabels(xlabels)

    plt.savefig('my_plot_05.png')
    plt.close()



Answer 3:

import pandas as pd
import numpy as np

df= data

bins = np.arange(0,0.1,0.001)
df.hist(bins=bins,color='grey')


文章来源: Defining bin width/x-axis scale in Matplotlib histogram