2016-11-07 71 views
3

这是与我最后一个问题不同的问题。 我使用facetgrid通过以下代码打印直方图。Seaborn的线迹盒宽度不能延伸到bin标签

import numpy as np 
import pandas as pd 
import seaborn as sns 
import matplotlib as mpl 
import matplotlib.pyplot as plt 

titanic = sns.load_dataset("titanic") 
g= sns.FacetGrid(titanic, col ='survived', size = 3, aspect = 2) 
g.map(plt.hist, 'age', color = 'r'), plt.show() 
plt.show() 

我让seaborn决定箱标签/值,这就是我想出了

enter image description here

我已经注意到,酒吧本身并不一路延伸到标签。 因此,0-10标签内的第一个条形似乎延伸到了大约8个,而不是完全延伸到10个。做了一个快速的value_count(除非我错了),表明第一个条形确实只包括直到年龄的事件8.

我然后试图改变仓的量通过该代码包括:

g.map(plt.hist, 'age', bins =8, color = 'r'), plt.show() 

但左侧的图表看起来仍然关闭。 enter image description here

回答

6

因此,您在轴上看到的标签与箱子的宽度没有多大关系。实际上,轴上的标签选择为使得数据在相应的轴上可见。类似的事情发生,如果你让seaborn(matplotlib实际)选择bin的大小和数量。如果指定了箱号,则箱的宽度被选择为使得整个x范围的数据位于箱内。

如果你想控制箱的宽度,你需要传递一个列表,而不仅仅是一个bin参数的数字。假设你要10个箱从0到100,你可能会这样写:

g.map(plt.hist, 'age', bins=range(0, 110, 10)], color = 'r') 

,这将给你:

enter image description here

所以,bins看起来像[0, 10, ..., 100]

你可能不想如此硬编码,并希望有一些更灵活的方式来指定箱。一种选择是定义一个容器宽度,并从数据的开始到结束都有一些容器。这可能是这样的:

b_width = 10 # chose an arbitrary value here 
my_bins = np.arange(min(titanic['age']), max(titanic['age']) + b_width, b_width) 
g.map(plt.hist, 'age', bins=my_bins, color = 'r') 

注:需要在np.arange因为我们正与彩车工作。如果你的数据是整数,你也可以使用range

现在您可能还想调整xticks,以使它们也显示出库的开始。 Pyplot具有用于方便的命令:

plt.xticks(range(0, 110, 10)) 

或后者的例子:

plt.xticks(np.around(my_bins, decimals=1)) 

np.around可能需要为您的数据可能开始在彩车将很难看,在x轴刻度标签。 另外请注意,plt.xticks可以做更多的方便的事情,所以你应该去和have a loock

我希望有帮助!

+0

嗨Jojo,在你的代码的这一行中添加'+ b_width'的原因是什么。 'np.arange(min(titanic ['age']),max(titanic ['age'])+ b_width'。谢谢 – Moondra

+0

还有一个问题,如何在运行代码后手动标记x轴' g.map(plt.hist,'age',bins = range(0,110,10)],color ='r')'我想让它(标签)以10为增量增加。谢谢! – Moondra

+1

你好@moondra是因为'range'或'np.arange'的上限没有被使用,如果你没有添加它,那么在上面的例子中将会缺少'100'。 – jojo