2017-04-05 39 views
0

我對python完全陌生。我做了一個破碎的條形圖作爲一個副劇。根據功率的大小用於破碎條形圖的colorbar

load profile in matplotlib

的負載顏色編碼。目前,apha值是手動提供的,但我可以設置範圍,比如0-50,alpha = 0.2。現在我想在右側添加一個顏色條。什麼是最好的方法?任何幫助是最受歡迎的。請注意,此圖是一個子圖。這是我的代碼:

import matplotlib.pyplot as plt 
import matplotlib.colors as mcolors 
from matplotlib.figure import Figure 
import matplotlib.cm 
from pylab import * 
import numpy as np 

#code for the previous subplots 

ax3.set_title('Load Profile') 
ax3.patch.set_facecolor('silver') 

barHeight = 3 
ticklist = [] 
def drawLoadDuration(period, starty, opacity): 
    ax3.broken_barh((period), (starty, barHeight), alpha=opacity, facecolors='#330033', lw=0) 
    ticklist.append(starty+barHeight/2.0) 
    return 0 

drawLoadDuration([(0, 5), (13, 4), (19, 3), (23, 1)], 3, 0.5) #Fan 
drawLoadDuration([(19, 1)], 9, 0.65) #Tube Light 
drawLoadDuration([(19, 5)], 15, 0.35) #Bulb 
drawLoadDuration([(7, 2), (16, 1)], 21, 0.28) #Charger 
drawLoadDuration([(15, 0.5), (20, 1)], 27, 0.7) #Television 
drawLoadDuration([(9, 1), (17, 1)], 33, 1) #Pump 
drawLoadDuration([(2,4)], 39, 0.8) #Scooter 

ax3.set_ylim(0, 45) 
ax3.set_xlim(0, 24) 
ax3.set_xlabel('Time (Hours)') 
ax3.set_yticks(ticklist) 
ax3.set_xticks([0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5, 18, 18.5, 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, 23, 23.5, 24]) 
ax3.set_xticklabels(['', '1am', '', '2am', '', '3am', '', '4am', '', '5am', '', '6am', '', '7am', '', '8am', '', '9am', '', '10am', '', '11am', '', '12pm', '', '1pm', '', '2pm', '', '3pm', '', '4pm', '', '5pm', '', '6pm', '', '7pm', '', '8pm', '', '9pm', '', '10pm', '', '11pm', '', '12am'], fontsize='9') 
ax3.tick_params('x', colors='MidnightBlue') 
ax3.set_yticklabels(['Fan', 'Tube light', 'Bulb', 'Cellphone Charger', 'Television', 'Pump', 'Scooter']) 
ax3.grid(True) 

f.subplots_adjust(hspace=0.24, right=0.93, left=0.11) 
plt.setp([a.get_xticklabels() for a in f.axes[:-1]], visible=False) 

回答

0

您可能會使用顏色映射的概念。顏色映射表將顏色的值介於0和1之間。因此,不是使用固定顏色並根據輸入值調整不透明度,您可以根據顏色表獲取條的顏色。

優點是您可以稍後使用該顏色圖創建一個顏色條。

import matplotlib.pyplot as plt 
import matplotlib.cm 
import numpy as np 

fig, ax3 = plt.subplots(figsize=(8,4)) 

ax3.set_title('Load Profile') 
ax3.patch.set_facecolor('silver') 

# use a colormap 
cmap = plt.cm.Blues 

barHeight = 3 
ticklist = [] 
def drawLoadDuration(period, starty, opacity): 
    # facecolor according to colormap 
    ax3.broken_barh((period), (starty, barHeight), facecolors=cmap(opacity), 
                lw=0, zorder=2) 
    ticklist.append(starty+barHeight/2.0) 

drawLoadDuration([(0, 5), (13, 4), (19, 3), (23, 1)], 3, 0.5) #Fan 
drawLoadDuration([(19, 1)], 9, 0.65) #Tube Light 
drawLoadDuration([(19, 5)], 15, 0.35) #Bulb 
drawLoadDuration([(7, 2), (16, 1)], 21, 0.28) #Charger 
drawLoadDuration([(15, 0.5), (20, 1)], 27, 0.7) #Television 
drawLoadDuration([(9, 1), (17, 1)], 33, 1) #Pump 
drawLoadDuration([(2,4)], 39, 0.8) #Scooter 

ax3.set_ylim(0, 45) 
ax3.set_xlim(0, 24) 
ax3.set_xlabel('Time (Hours)') 
ax3.set_yticks(ticklist) 
xticklist = np.linspace(0.5, 24, 48) 
ax3.set_xticks(xticklist) 
ax3.set_xticklabels(["{}{}m".format(int(h%12+12*(h%12==0)), 
        {0:"p",1:"a"}[(h%24)<12]) if ((h*10)%10)==0 \ 
        else "" for h in xticklist], fontsize='9', rotation=90) 
ax3.tick_params('x', colors=cmap(1.)) 
ax3.set_yticklabels(['Fan', 'Tube light', 'Bulb', 'Cellphone Charger', 
             'Television', 'Pump', 'Scooter']) 
ax3.grid(True) 

# create a scalarmappable from the colormap 
sm = matplotlib.cm.ScalarMappable(cmap=cmap) 
sm.set_array([]) 
# and use this scalarmappable to create a colorbar 
fig.colorbar(sm, ax=ax3,label="load") 


fig.subplots_adjust(hspace=0.24, right=0.93, left=0.2, bottom=0.2) 
plt.show() 

enter image description here

+0

謝謝!我該如何對這些值進行顏色編碼?例如,對於100-500W,不透明度= 0.5)? 另外,我需要根據其他子圖調整大小。再次感謝! –

+0

我認爲你想使用一個彩條來進行連續的映射,即50W的顏色比100W的淺,100W的顏色比150W淺,等等。因爲我現在不知道你真正想要什麼,所以你最好在問題中詳細描述它。彩條應該是什麼樣子?哪些顏色應該在哪裏? – ImportanceOfBeingErnest

+0

關於規模,這可能是一個不同的問題;你可以從這裏開始(http://matplotlib.org/examples/axes_grid/demo_axes_divider.html),並且已經有一些關於顏色條和子圖的問題。如果他們沒有幫助,可以問你一個新的具有你的特定子情節的安排。 – ImportanceOfBeingErnest