使用 pywaffle 在 python 中创建带有影线的华夫饼图

Create a waffle chart with hatches in python using pywaffle

我想为以下数据帧创建一个灰色形状的华夫饼图

data = pd.DataFrame({'Category': ['a', 'b', 'c', 'd'], 'no_occurrence' : [594, 5, 10, 9]})

这是我目前所做的基于

import matplotlib.pyplot as plt 
from pywaffle import Waffle
fig = plt.figure(
    FigureClass=Waffle, 
    rows=5,
    colors = ('lightgrey', 'black', 'darkgrey', 'lightgrey'),
    values=list(data['no_occurrence']/4),
    labels=list(data['Category']),
    icons = 'sticky-note', 
    icon_size = 11,
    figsize=(12, 8),
    icon_legend = True,
    legend={'loc': 'lower left','bbox_to_anchor': (0, -0.4), 'ncol': len(data), 'fontsize': 8}    
)

由于灰色的形状很难区分,我想对最后一类(在图中和图例中)进行阴影线处理,但我不知道如何在颜色中添加阴影线。我有一个包含相同类别的条形图,我在其中添加了影线,所以我想保持一致。

在华夫饼图中使用图标作为元素时,它们在内部表示为具有特殊字体的文本对象。

使用 patheffects,可以添加影线,既可以添加到图中的图标,也可以添加到图例中的图标。

由于你没有提供玩具数据,也没有图片,我编了一些数据来展示想法。由于我的图例图标比图中的图标小,所以我为图例使用了更密集的阴影线。

import matplotlib.pyplot as plt
from matplotlib import patheffects
import numpy as np
from pywaffle import Waffle

values = [5, 14, 17, 18]
fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    colors=('lightgrey', 'black', 'darkgrey', 'lightgrey'),
    values=values,
    labels=[*'abcd'],
    icons='sticky-note',
    icon_size=60,
    figsize=(12, 8),
    icon_legend=True,
    legend={'loc': 'lower left', 'bbox_to_anchor': (0, -0.4), 'ncol': 4, 'fontsize': 15,
            'facecolor': 'white', 'edgecolor': 'black'})
for t in fig.ax.texts[-values[-1]:]:
    t.set_path_effects([patheffects.PathPatchEffect(hatch='xxx', fc='lightgrey', ec='white')])  # color='lightgrey')])
fig.ax.legend_.legendHandles[-1].set_path_effects(
    [patheffects.PathPatchEffect(hatch='xxxxx', fc='lightgrey', ec='white')])
fig.tight_layout()
plt.show()