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

问题描述

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

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

这是我到目前为止所做的基于 this post

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',ec='white')])
fig.tight_layout()
plt.show()

example waffle chart

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...