<ul>
<li>如果直接使用<a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.pie.html" rel="nofollow noreferrer">^{<cd1>}</a>绘制数据帧,则颜色将得到正确管理。
<ul>
<li>选择要打印的特定列:<code>dfc[['b', 'c', 'd', 'e', 'f', 'g']].plot.pie(...)</code></li>
</ul>
</li>
<li>使用<a href="https://pandas.pydata.org/docs/reference/api/pandas.melt.html" rel="nofollow noreferrer">^{<cd3>}</a>将数据帧从宽转换为长</li>
<li>使用<a href="https://pandas.pydata.org/docs/reference/api/pandas.crosstab.html" rel="nofollow noreferrer">^{<cd4>}</a>获取每个组的值计数
<ul>
<li><code>dfc</code>显示所有值,即使是0,这与使用<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.value_counts.html" rel="nofollow noreferrer">^{<cd6>}</a>不同。这将确保每个组的颜色始终正确应用</李>
</ul>
</li>
<li>使用<code>autopct='%1.1f%%'</code>或<code>autopct = lambda v: f'{v:.1f}%' if v > 0 else None</code>格式化楔形标签。第二个选项不会添加标签,除非值为<code>>0</code></li>
</ul>
<pre><code># display(dfc)
variable a b c d e f g
value
NO 0 3 5 2 3 0 4
SI 5 2 0 3 2 5 1
</code></pre>
<ul>
<li>这通过消除冗余大大减少了代码库</li>
<li><strong>在<code>pandas 1.3.2</code>和<code>matplotlib 3.4.2</code></strong></li>
</ul>
<pre class="lang-py prettyprint-override"><code>import pandas as pd
from matplotlib.patches import Patch
# used df from the OP
def pieplotstest(df):
colors=["#172a3d", "#e33e31"]
textprops=dict(color="w", weight='bold', size=9)
labels=['NO','SI']
# convert the dataframe from wide to long
dfm = df.melt()
# get the counts for each group
dfc = pd.crosstab(dfm.value, dfm.variable)
# format the percent value to be None if the value is not greater than 0
autopct = lambda v: f'{v:.1f}%' if v > 0 else None
# plot the dataframe directly
axes = dfc.plot.pie(subplots=True, layout=(2, 4), colors=colors,
autopct=autopct, figsize=(10, 6), textprops=textprops,
wedgeprops=dict(width=0.5), pctdistance=0.7, legend=False)
# flatten the array of axes
axes = axes.ravel()
# extract the figure object
fig = axes[0].get_figure()
# rotate the label
for ax in axes:
yl = ax.get_ylabel()
ax.set_ylabel(yl, rotation=0, fontsize=12)
# create the legend
legend_elements = [Patch(fc=c, label=l) for c, l in zip(colors, labels)]
fig.legend(handles=legend_elements, loc=4, fontsize=12, bbox_to_anchor=(.95, .2))
fig.tight_layout()
fig.suptitle('Como estan distribuidas tus ventas')
fig.savefig(f'orders3.png',dpi=600,transparent=True)
pieplotstest(df)
</code></pre>
<p><a href="https://i.stack.imgur.com/JSB0x.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/JSB0x.png" alt="enter image description here"/></a></p>