将恒定宽度设置为条形图中的每个条形

时间:2014-12-17 20:32:51

标签: python matplotlib plot histogram seaborn

我正在尝试绘制一个条形图,其中每个bin有不同的长度,因此我最终得到了一个非常难看的结果。:)我想要做的仍然是能够定义一个尊重的bin长度,但所有条形图绘制相同的固定宽度。我怎样才能做到这一点?以下是我到目前为止所做的事情:

%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

sns.set_palette("deep", desat=.6)
sns.set_context(rc={"figure.figsize": (8, 4)})
np.random.seed(9221999)

data = [0,2,30,40,50,10,50,40,150,70,150,10,3,70,70,90,10,2] 
bins = [0,1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200]
plt.hist(data, bins=bins);

enter image description here

修改

这个问题已经被标记为重复,但实际上没有提出的链接解决了我的问题;第一个是一个非常糟糕的解决方法,第二个并没有解决问题,因为它设置了所有的条形码。宽度到一定数量。

2 个答案:

答案 0 :(得分:3)

您是否想要在每个垃圾箱的中心放置一个固定宽度的栏?

如果是这样,尝试类似于此的东西:

import numpy as np
import matplotlib.pyplot as plt

data = [0,2,30,40,50,10,50,40,150,70,150,10,3,70,70,90,10,2]
bins = [0,1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200]

counts, _ = np.histogram(data, bins)
centers = np.mean([bins[:-1], bins[1:]], axis=0)

plt.bar(centers, counts, width=5, align='center')
plt.show()

enter image description here

答案 1 :(得分:3)

您可以随身携带seaborn。但您必须了解seaborn本身使用 matplotlib创建图表。 AND:请删除您的other question,现在它确实是重复的。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

sns.set_palette("deep", desat=.6)
sns.set_context(rc={"figure.figsize": (8, 4)})

data = [0,2,30,40,50,10,50,40,150,70,150,10,3,70,70,90,10,2]
bins = [0,1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200]


bin_middles = bins[:-1] + np.diff(bins)/2.
bar_width = 1. 
m, bins = np.histogram(data, bins)
plt.bar(np.arange(len(m)) + (1-bar_width)/2., m, width=bar_width)
ax = plt.gca()
ax.set_xticks(np.arange(len(bins)))
ax.set_xticklabels(['{:.0f}'.format(i) for i in bins])

plt.show()

enter image description here

我个人认为,绘制这样的数据令人困惑。非线性(或非对数)轴缩放通常不是一个好主意。