Reputation: 141
I have a simple bar chart, with labeled bars. The x-axis moves from past to future dates. I'd like to use a larger alpha value on the future dates to indicate they values are estimates. I can't figure out how to adjust alpha. I found advice to change color with 'get_children()[].set_color() This is an OK work around, but I'd like to vary alpha such to have a better color match. I also tried using a list of alpha values and creating the bars in a for loop. This worked but I lost the labeling.
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()
Upvotes: 5
Views: 8839
Reputation: 35230
I'm using the color format in RGBA format, and the fourth value is the alpha value, so I'm making use of the list of alpha values you've created to create a color list. I've applied that to the bar chart.
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))
Upvotes: 6