【问题标题】:Matplotlib bar chart: independently adjust alpha values for specific barsMatplotlib 条形图:独立调整特定条形的 alpha 值
【发布时间】:2020-11-03 11:43:36
【问题描述】:

我有一个简单的条形图,带有标签条。 x 轴从过去日期移动到未来日期。我想在未来日期使用更大的 alpha 值来表明它们的值是估计值。我不知道如何调整 alpha。我找到了使用 'get_children()[].set_color() 更改颜色的建议,这是一个不错的解决方法,但我想改变 alpha 以获得更好的颜色匹配。我还尝试使用 alpha 值列表并在 for 循环中创建条形。这行得通,但我失去了标签。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

fig, ax = plt.subplots(figsize=(11,6))

req = [700, 600, 500, 450, 350, 300, 200, 150, 100, 50]
completed = [100, 100, 50, 100, 50, 100, 50, 50,50, 50]
Months=['May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec', 'Jan-21', 'Feb']

x = np.arange(len(req))  # the label locations
width = 0.4  # the width of the bars

#I got this to work using a for look on rects but then lost my 'autolabels'
#alphas_o=([.9, .9, .9, .9, .9, .9, .9, .5, .5, .5])
#alphas_c=([.9, .9, .9, .9, .9, .9, .5, .5, .5, .5])


rects1 = ax.bar(x - width/2, req, width, color='tab:orange', alpha = .9)
rects2 = ax.bar(x + width/2, completed, width, color='tab:blue', alpha =.9 )

#This is an OK work around, but changing alpha instead of color looks better
ax.get_children()[7].set_color('moccasin') 
ax.get_children()[8].set_color('moccasin') 
ax.get_children()[9].set_color('moccasin') 

ax.get_children()[16].set_color('lightsteelblue') 
ax.get_children()[17].set_color('lightsteelblue')
ax.get_children()[18].set_color('lightsteelblue')
ax.get_children()[19].set_color('lightsteelblue')


ax.set_ylabel('Counts',fontsize=12 )
ax.set_xticks(x)
ax.set_xticklabels(Months, fontsize=12)

#I put this legend in place when I used the for loop and list of alphas.  It works fine 
orange_patch = mpatches.Patch(color='tab:orange', label='Total Open Requests')
blue_patch = mpatches.Patch(color='tab:blue', label='Completed Requests')
ax.legend(handles=[orange_patch, blue_patch],  frameon=False, fontsize=12, bbox_to_anchor=(.9, .8))


def autolabel(rects):
    """Attach a text label above each bar in *rects*, displaying its height."""
    for rect in rects:
        height = rect.get_height()
        ax.annotate('{}'.format(height),
                    xy=(rect.get_x() + rect.get_width() / 2, height),
                    xytext=(0, 3),  # 3 points vertical offset
                    textcoords="offset points",
                    ha='center', va='bottom')

autolabel(rects1)
autolabel(rects2)

fig.tight_layout()

ax.tick_params(which='both',axis='y', left=False, right=False, labelleft=False, labelright=False)

# remove the frame of the chart
for spine in plt.gca().spines.values():
    spine.set_visible(False)

plt.show()

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    我使用的是 RGBA 格式的颜色格式,第四个值是 alpha 值,所以我使用您创建的 alpha 值列表来创建颜色列表。我已将其应用于条形图。

    alphas_o=([.9, .9, .9, .9, .9, .9, .9, .5, .5, .5])
    alphas_c=([.9, .9, .9, .9, .9, .9, .5, .5, .5, .5])
    rgba_colors = np.zeros((10,4))
    rgba_colors[:,0] = 1.0
    rgba_colors[:, 3] = alphas_o
    rgba_colors1 = np.zeros((10,4))
    rgba_colors1[:,2] = 1.0
    rgba_colors1[:, 3] = alphas_c
    
    rects1 = ax.bar(x - width/2, req, width, color=rgba_colors)
    rects2 = ax.bar(x + width/2, completed, width, color=rgba_colors1)
    
    ax.set_ylabel('Counts',fontsize=12 )
    ax.set_xticks(x)
    ax.set_xticklabels(Months, fontsize=12)
    
    orange_patch = mpatches.Patch(color='r', label='Total Open Requests')
    blue_patch = mpatches.Patch(color='b', label='Completed Requests')
    ax.legend(handles=[orange_patch, blue_patch],  frameon=False, fontsize=12, bbox_to_anchor=(.9, .8))
    

    【讨论】:

    • 谢谢。感谢您的帮助,并很惊讶您的速度如此之快。这是一个很好的解决方案。
    • 格伦,如果这解决了你的问题,请考虑accepting this answer (the tick on the left side).
    • 很高兴我也能帮助到你。请接受我的回答。
    • 感谢您解释接受。抱歉耽搁了,我想知道如何给你一个upvote,这是我第一个发布的问题。我使用您解释的 RGBA 方法完成了图表。很好。谢谢你教我一些新东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2015-12-25
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多