Does anyone know why this code doesn't plot the boxes colors correctly. I want each component to be a different color but they all come out black with a blue legend.
fr开发者_如何学运维om numpy import array, zeros
import matplotlib.pyplot as plt
# Components: Useage times (start, stop), wattage, detail
COMPONENTS = {"fridge": ( [(0.0,24.0)], 35, " Litres"),
"kettle": ([(7.3,7.33), (19.0,19.3)], 2500, ""),
"netbook": ([(8.0,9.3),(12.0,15.0)], 12.5, ""),
"light bulb": ([(18.0,22.0)], 20, "")
}
COLORS = ('b','g','r','c','m','y','k','w')
PLOT = []
TIME = range(24*60)
Powers = [] # list of array of power for each component
for key in COMPONENTS.keys(): # each useage
p = zeros(len(TIME))
for j in COMPONENTS[key][0]: # start and stop
start = round(j[0]*60)
end = round(j[1]*60)
p[start:end] = COMPONENTS[key][1]
Powers.append(p)
b=zeros(len(TIME))
for i in range(len(COMPONENTS.keys())):
PLOT.append(plt.bar(TIME,Powers[i],width = 1, color=COLORS[i], bottom=b))
b+=Powers[i]
plt.ylabel('Power (W)')
plt.xlabel('Time (h)') ###
plt.title('Power Cycle')
plt.xticks(range(0,25*60,60) ,[str(t) for t in range(25)])
plt.legend( tuple([i for i in PLOT]), tuple([c for c in COMPONENTS.keys()]) )
plt.show()
Your code, as far as the graph is concerned, is fine. The problem is that there are too many bars, so you only see the black borders. This is what looks when zooming in:
To get the legend right, pass the label
argument while plotting, then just call plt.legend()
without arguments when you're done.
精彩评论