【问题标题】:colorbar for a broken bar chart损坏条形图的颜色条
【发布时间】:2017-08-30 13:32:18
【问题描述】:

我对 python 完全陌生。我制作了一个损坏的条形图作为子图。

负载根据功率大小进行颜色编码。目前,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)

【问题讨论】:

    标签: python python-2.7 matplotlib subplot colorbar


    【解决方案1】:

    您可以使用颜色图的概念。颜色图将 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()
    

    【讨论】:

    • 谢谢!如何对值进行颜色编码?例如,(对于 100-500 W,不透明度 = 0.5)?另外,我需要根据其他子图调整大小。再次感谢!
    • 我以为您想使用颜色条进行连续映射,即 50 W 的颜色比 100 W 浅,100 W 的颜色比 150 W 浅,依此类推。由于我现在不知道您真正想要什么,因此您最好在问题中详细说明。颜色条应该是什么样的?哪些颜色应该在哪里?
    • 关于尺寸,这可能是一个不同的问题;你可以开始 here 并且已经有几个关于颜色条和子图的问题。如果他们没有帮助,请根据您的特定子情节安排询问新的。
    猜你喜欢
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2018-12-14
    • 2011-08-03
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多