【问题标题】:set constant width to every bar in a bar plot为条形图中的每个条形设置恒定宽度
【发布时间】:2015-02-16 12:26:33
【问题描述】:

我正在尝试绘制一个条形图,其中每个 bin 的长度不同,结果我得到了一个非常丑陋的结果。c:) 我想做的仍然是能够定义一个尊重的 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);

编辑

这个问题已被标记为重复,但实际上没有一个建议的链接解决了我的问题;第一个是一个非常糟糕的解决方法,第二个根本没有解决问题,因为它将所有条形的宽度设置为某个数字。

【问题讨论】:

  • @Andy 抱歉,但您的链接没有解决我的问题。查看我的编辑。

标签: python matplotlib plot histogram seaborn


【解决方案1】:

随你的便,seaborn。但是您必须了解seaborn 本身使用 matplotlib 来创建绘图。 并且:请删除您的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()

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

【讨论】:

  • 好的,所以我删除了我的另一个问题。另外,谢谢你的回答,但是为什么中间有这么多空格?
  • 好吧,看看data。例如,56 之间没有值。 Wikipedia 上有一篇关于 historgrams 及其构建方式的好文章
【解决方案2】:

您想在每个 bin 的中心放置一个固定宽度的条吗?

如果是这样,请尝试类似的方法:

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()

【讨论】:

  • 谢谢。这可能有效,但正如您所见,我正在使用不同的库。有什么想法吗?
  • @user706838 - 你根本没有使用不同的库......你正在使用 matplotlib 和 numpy。 seaborn 只是 matplotlib 的一个薄包装。由于默认样式不同,您的绘图看起来会略有不同,但我示例中的代码不会改变。
  • 我看不到相似之处...如果您能将您的想法应用于 plt.hist() 函数,我将不胜感激。你能帮我做吗?
  • 您不能对 hist 执行此操作。 hist 所做的只是使用np.histogram ,然后以特定方式调用plt.bar
猜你喜欢
  • 2013-08-28
  • 2012-11-01
  • 2011-10-05
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2014-12-17
相关资源
最近更新 更多