matplotlib Python:使用自定义条柱绘制直方图

laawzig2  于 2023-01-13  发布在  Python
关注(0)|答案(3)|浏览(171)

我正在使用matplotlib.pyplot制作直方图,由于数据的分布,我想手动设置bin,具体如下:
1.一个bin中的任何值= 0;
1.最后一个bin中的任意值> 60;
1.任何值> 0<= 60都在上述区间之间,并且区间大小为5
你能给予我个忙吗?谢谢。

a64a0gku

a64a0gku1#

我不知道你所说的“bin大小为5”是什么意思,你可以用specifying the bins with a sequence来绘制直方图:

import matplotlib.pyplot as plt
data = [0, 0, 1, 2, 3, 4, 5, 6, 35, 60, 61, 82, -5] # your data here
plt.hist(data, bins=[0, 0.5, 60, max(data)])
plt.show()

但是bin大小将匹配相应的区间,这意味着--在本例中--“0-case”将几乎不可见:

(Note当将bin指定为序列时,60移动到最后一个bin,将序列更改为[0, 0.5, 59.5, max(data)]将修复该问题)
您(可能)需要首先对数据进行分类,然后绘制类别条形图:

import matplotlib.pyplot as plt
import pandas as pd

data = [0, 0, 1, 2, 3, 4, 5, 6, 35, 60, 61, 82, -5] # your data here

df = pd.DataFrame()
df['data'] = data

def find_cat(x):
    if x == 0:
        return "0"
    elif x > 60:
        return "> 60"
    elif x > 0:
        return "> 0 and <= 60"

df['category'] = df['data'].apply(find_cat)
df.groupby('category', as_index=False).count().plot.bar(x='category', y='data', rot=0, width=0.8)
plt.show()

输出:

mi7gmzs6

mi7gmzs62#

根据Tranbi的回答,您可以指定垃圾箱边缘,如他们共享的链接中所详细说明的那样。

import matplotlib.pyplot as plt
import pandas as pd
data = [0, 0, 1, 2, 3, 4, 5, 6, 35, 60, 61, 82, -6] # your data here
df = pd.DataFrame()
df['data'] = data

bin_edges = [-5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65]
bin_edges_offset = [x+0.000001 for x in bin_edges]

plt.figure()
plt.hist(df['data'], bins=bin_edges_offset)
plt.show()

histogram

i1icjdpr

i1icjdpr3#

IIUC您需要一个0(不包括)和60(包括)之间的值的经典直方图,并在侧面添加两个0和〉60的柱。
在这种情况下,我建议分别绘制3个区域:

import matplotlib.pyplot as plt

data = [0, 0, 1, 2, 3, 4, 5, 6, 35, 60, 61, 82, -3] # your data here

fig, axes = plt.subplots(1,3, sharey=True, width_ratios=[1, 12, 1])
fig.subplots_adjust(wspace=0)

# counting 0 values and drawing a bar between -5 and 0
axes[0].bar(-5, data.count(0), width=5, align='edge')   
axes[0].xaxis.set_visible(False)
axes[0].spines['right'].set_visible(False)
axes[0].set_xlim((-5, 0))

# histogram between (0, 60]
axes[1].hist(data, bins=12, range=(0.0001, 60.0001))
axes[1].yaxis.set_visible(False)
axes[1].spines['left'].set_visible(False)
axes[1].spines['right'].set_visible(False)
axes[1].set_xlim((0, 60))

# counting values > 60 and drawing a bar between 60 and 65
axes[2].bar(60, len([x for x in data if x > 60]), width=5, align='edge')
axes[2].xaxis.set_visible(False)
axes[2].yaxis.set_visible(False)
axes[2].spines['left'].set_visible(False)
axes[2].set_xlim((60, 65))

plt.show()

输出:

编辑:如果你想绘制概率密度图,我可以编辑数据并简单地使用hist

import matplotlib.pyplot as plt

data = [0, 0, 1, 2, 3, 4, 5, 6, 35, 60, 61, 82, -3] # your data here

data2 = []
for el in data:
    if el < 0:
        pass
    elif el > 60:
        data2.append(61)
    else:
        data2.append(el)

plt.hist(data2, bins=14, density=True, range=(-4.99,65.01))
plt.show()

相关问题