将 pyplot 网格颜色发送到背景和从 20 而不是 0 开始的百分比值

send pyplot grid color to background and percentage values starting from 20 instead of 0

我正在使用 pyplot 制作条形图。我有一行代码,我为情节设置了一个网格,如下所示:

plt.grid(color='#95a5a6', linestyle='--', linewidth=2, axis='y', alpha=1)

我需要将网格发送到后台而不是后台。

此外,y 轴值从 0% 开始。我想从 20% 开始。

完整代码如下:

plt.bar(r1, dao, color='blue', width=barWidth, edgecolor='white', label='DAO')
plt.bar(r2, pie_gdp, color='orange', width=barWidth, edgecolor='white', label='PIE- GDP')
plt.bar(r3, pie_sdp, color='gray', width=barWidth, edgecolor='white', label='PIE-SDP')
plt.grid(color='#95a5a6', linestyle='--', linewidth=2, axis='y', alpha=1)

plt.xticks([r + barWidth for r in range(len(dao))], ['DNN-Sigmoid', 'CNN-Sigmoid', 'DNN-ReLU', 'CNN-ReLU'])
plt.gca().set_yticklabels(['{:.0f}%'.format(x*1) for x in plt.gca().get_yticks()])
plt.legend(loc='lower center', bbox_to_anchor=(0.5, -0.20), ncol=3)

plt.show()

daopie_gdppie_sdp np.arrays 包含我正在绘制的数据

使用ax.set_axisbelow(True) 使网格线位于图上元素的后面。 plt.ylim()(或ax.set_ylim())可以更改数据限制。 PercentFormatter 将刻度标签格式化为百分比。

import matplotlib.pyplot as plt
from matplotlib.ticker import PercentFormatter
import numpy as np

barWidth = 0.8 / 3
r1 = np.arange(4)
r2 = r1 + barWidth
r3 = r2 + barWidth
dao = np.random.uniform(20, 100, 4)
pie_gdp = np.random.uniform(20, 100, 4)
pie_sdp = np.random.uniform(20, 100, 4)

plt.bar(r1, dao, color='blue', width=barWidth, edgecolor='white', label='DAO')
plt.bar(r2, pie_gdp, color='orange', width=barWidth, edgecolor='white', label='PIE- GDP')
plt.bar(r3, pie_sdp, color='gray', width=barWidth, edgecolor='white', label='PIE-SDP')
plt.grid(color='#95a5a6', linestyle='--', linewidth=2, axis='y', alpha=1)
ax = plt.gca()
ax.set_axisbelow(True)  # grid lines behind other elements

plt.xticks(r1 + barwidth, ['DNN-Sigmoid', 'CNN-Sigmoid', 'DNN-ReLU', 'CNN-ReLU'])
plt.ylim(20, None)  # start from 20
ax.yaxis.set_major_formatter(PercentFormatter(100))
for spine in ['top', 'right']:
    ax.spines[spine].set_visible(False)  # hide part of the box
plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), ncol=3)

plt.tight_layout()  # fit subplot and texts nicely into the figure
plt.show()