2017-04-05 2 views
0

Ich bin total neu in Python. Ich habe ein gebrochenes Balkendiagramm als Nebenhandlung erstellt.colorbar für ein gebrochenes Balkendiagramm

load profile in matplotlib

Die Lasten werden farbcodiert basierend auf der Größe der Macht. Momentan werden die Apha-Werte manuell angegeben, aber ich kann Bereiche festlegen, z. B. für 0-50, Alpha = 0,2. Jetzt möchte ich eine Farbleiste auf der rechten Seite hinzufügen. Was ist der beste Ansatz, um voranzukommen? Jede Hilfe ist sehr willkommen. Bitte beachten Sie, dass dieses Diagramm ein Teilplot ist. Hier ist mein Code:

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) 

Antwort

0

Sie könnten das Konzept einer Colormap verwenden. Eine Colormap ordnet Werte zwischen 0 und 1 einer Farbe zu. Anstatt eine feste Farbe zu verwenden und die Opazität als Funktion des Eingabewerts anzupassen, erhalten Sie möglicherweise eine Farbe für den Balken entsprechend der Farbpalette.

Der Vorteil ist, dass Sie später genau diese Colormap verwenden können, um eine Farbleiste zu erstellen.

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

Dank! Wie kann ich die Werte farblich codieren? Zum Beispiel (für 100-500 W, Opazität = 0,5)? Außerdem muss ich die Größe entsprechend den anderen Teilplots anpassen. Danke noch einmal! –

+0

Ich dachte, dass Sie eine Farbleiste verwenden wollten, um eine kontinuierliche Zuordnung zu haben, d. H. 50 W ist heller als 100 W und 100 W ist heller als 150 W und so weiter. Da ich jetzt nicht weiß, was du wirklich willst, solltest du es am besten in der Frage genau beschreiben. Wie sollte die Farbleiste aussehen? Welche Farben sollen wo sein? – ImportanceOfBeingErnest

+0

In Bezug auf die Größe ist dies wahrscheinlich eine andere Frage; Sie können [hier] (http://matplotlib.org/examples/axes_grid/demo_axes_divider.html) starten und es gibt bereits ein paar Fragen zu Farbbalken und Unterplotts. Wenn sie nicht helfen, fragen Sie einen neuen mit Ihrer spezifischen Subplot-Anordnung. – ImportanceOfBeingErnest