2016-11-07 64 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