我不知道有哪个库可以开箱即用地进行这种着色。使用 seaborn boxplot,您可以遍历生成的框并分配单独的颜色和透明度。自定义图例可以通过灰色阴影显示透明度:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
test = pd.DataFrame([[2021, 'female', 3], [2021, 'male', 1], [2021, 'female', 6],
[2021, 'female', 3], [2021, 'male', 4], [2021, 'female', 10],
[2020, 'female', 2], [2020, 'male', 9], [2020, 'male', 7],
[2020, 'female', 1], [2020, 'male', 5], [2020, 'male', 8]
], columns=['Year', 'category', 'value'])
plt.figure(figsize=(20, 8))
sns.set_style('white')
ax = sns.boxplot(y='value', x='category', data=test, hue='Year')
ax.tick_params(axis='x', labelsize=14)
hue_values = np.sort(test['Year'].unique())
num_hue_values = len(hue_values)
colors = ['crimson', 'dodgerblue']
min_alpha = 0.3
max_alpha = 0.6
alphas = np.linspace(min_alpha, max_alpha, num_hue_values)
for i, box in enumerate(ax.artists):
box.set_facecolor(colors[i // num_hue_values])
box.set_alpha(alphas[i % num_hue_values])
handles = [plt.Rectangle((0, 0), 0, 0, facecolor='black', edgecolor='black', alpha=alpha, label=label)
for alpha, label in zip(alphas, hue_values)]
ax.legend(handles=handles)
plt.show()
这是另一个具有更多色调类别的示例:
tips = sns.load_dataset('tips')
plt.figure(figsize=(20, 8))
sns.set_style('white')
ax = sns.boxplot(y='total_bill', x='sex', data=tips, hue='day')
ax.tick_params(axis='x', labelsize=14)
hue_values = tips['day'].cat.categories
num_hue_values = len(hue_values)
colors = ['lime', 'purple']
min_alpha = 0.3
max_alpha = 0.6
alphas = np.linspace(min_alpha, max_alpha, num_hue_values)
for i, box in enumerate(ax.artists):
box.set_facecolor(colors[i // num_hue_values])
box.set_alpha(alphas[i % num_hue_values])
handles = [plt.Rectangle((0, 0), 0, 0, facecolor='black', edgecolor='black', alpha=alpha, label=label)
for alpha, label in zip(alphas, hue_values)]
ax.legend(handles=handles)
sns.despine()
plt.show()