2016-12-16 41 views
1

我正在嘗試製作堆疊直方圖,其中每個堆疊組件具有不同的線條樣式和顏色。 color參數接受列表和每個組件的顏色。但是linestyle參數ls沒有。有沒有辦法分別控制每個堆疊組件的面和線型?pyplot hist()每個堆疊組件的單獨線型

import numpy as np 
import matplotlib.pyplot as plt 

x = np.random.random(100) 

# this works: 
plt.hist([x,x], histtype='stepfilled', stacked=True, color=['r', 'b']) 

# this does not: 
plt.hist([x,x], histtype='stepfilled', stacked=True, color=['r', 'b'], ls=['-', '--']) 

理想情況下,我想在color和face-並且每個堆疊部件的edgecolor兩者的alpha二者的完全控制。那可能嗎?我試過玩fc選項,但也不接受列表。

我也看過這個例子[1],它在ax2上顯示了這種行爲,但它看起來很黑。例如,下面的代碼產生一個有錯誤的結果:

plt.hist([(0,1,1), (0,0,1)], histtype='step', stacked=True, fill=True) 

有捕捉patches和單獨控制它們,就像在此答案的解決方法[2]。但我想知道是否也可以直接從plt.hist()?

[1] http://matplotlib.org/examples/statistics/histogram_demo_multihist.html

[2] https://stackoverflow.com/a/17517721/5064815

回答

1

您可以cycle through the linestyles以同樣的方式,你可以通過其他參數循環。

import numpy as np 
import matplotlib.pyplot as plt 
from cycler import cycler 

plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b']) + 
          cycler('linestyle', ['-', '--', ':']) + 
          cycler('linewidth', [4,3,1]))) 

x = np.random.random(100) 
plt.hist([x,x*0.8,x*0.5], histtype='stepfilled', stacked=True) 

plt.show() 

旁註:我目前還不知道爲什麼在這個例子中循環順序顛倒了,即藍色的形狀有粗實線條樣式。但我想這可以根據需要進行調整。

+0

謝謝!但我想這會改變所有後續繪圖的'prop_cycle'?所以你必須在繪製'hist'之後重置它。我想我仍然會對更直接的做法感興趣。 – lab

相關問題