如何将平均值添加到 Python 中的分类图

How Add Average Values to a Categorical Plot in Python

正在尝试将平均值添加到绘图中的每个类别。我一直在尝试按类别独立地添加这些平均值,但没有成功。有没有一种方法可以让 catplot 对数据集中的值进行平均,并用不同的颜色绘制额外的值?我的目标是添加平均值并将其与单个值区分开来,以便可以直观地识别。

plt.rcParams["figure.figsize"] = [5.50, 5.50]
plt.rcParams["figure.autolayout"] = True

ax = sns.catplot(x="Sample Set", y="Values [%]", data=df)
ax.set_xticklabels(rotation=90)
ax.despine(right=True, top=True)

sp = 100
delta = 5
plt.axhline(y=sp, color='gray', linestyle='--', label='Target')

plt.axhline(y=sp*((100+(delta*2))/100), color='r', linestyle='--', label='10%')
plt.axhline(y=sp*((100-(delta*2))/100), color='r', linestyle='--')

plt.ylim(80, 120)
plt.title('Sample Location[enter image description here][1]', fontsize = 14, y=1.05)
    
plt.legend(frameon=False, loc ="lower right")
plt.savefig(outputFileName, dpi=300, bbox_inches = 'tight')
plt.show()
plt.draw()

根据 plotting with seaborn using the matplotlib object-oriented interface 的说法,因为 catplot 是一种 Figure-level 类型的图表,与其他类型的图表相比,这样做会困难得多。

The second group of functions (Figure-level) are distinguished by the fact that the resulting plot can potentially include several Axes which are always organized in a "meaningful" way. That means that the functions need to have total control over the figure, so it isn't possible to plot, say, an lmplot onto one that already exists. Calling the function always initializes a figure and sets it up for the specific plot it's drawing.

您可能 运行 进入了奇怪的错误消息,因为您将 sns.catplot 的 return 值命名为 axsns.catplot is a "figure-level" 函数和 return 一个 FacetGrid,通常分配给名为 g 的变量。图级函数可以有一个或多个子图,可通过 g.axes 访问。当只有一个子图时,g.ax 指向那个子图。

另请注意,catplot 的图形大小不是通过 rcParams 设置的。图形大小来自 height= 参数(一个子图的高度,以英寸为单位)和 aspect= 参数(子图的宽度和高度之间的比率),乘以 rows/columns 的数量子图。

此外,您似乎混合了 "object-oriented" 和 matplotlib 的 pyplot 接口。为了可读性和代码维护,最好坚持一个接口。

为了表示均值,sns.pointplot 不带置信区间可能是合适的。 ax.axhspan 可用于可视化目标周围的范围。

下面是一些示例代码,从 seaborn 的鸢尾花数据集开始。

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

iris = sns.load_dataset('iris')

g = sns.catplot(data=iris, x="species", y="sepal_length", height=5.50, aspect=1)
ax = g.ax
ax.tick_params(axis='x', rotation=0, length=0)
sns.pointplot(data=iris, x="species", y="sepal_length", estimator=np.mean,
              join=False, ci=None, markers=['D'], color='black', size=20, zorder=3, ax=ax)
sns.despine(right=True, top=True)

sp = 6
delta = 10
ax.axhline(y=sp, color='gray', linestyle='--', label='Target')
ax.axhspan(ymin=sp * (100 - delta) / 100, ymax=sp * (100 + delta) / 100,
           color='r', alpha=0.15, linestyle='--', label='10%')

ax.collections[-1].set_label('Mean')
ax.legend(frameon=False, loc="lower right")
# plt.savefig(outputFileName, dpi=300, bbox_inches='tight')
plt.tight_layout()
plt.show()