0

尝试将平均值添加到图中的每个类别。我一直在尝试按类别独立添加这些平均值,但没有成功。有没有一种方法可以让 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()

代码的电流输出

4

2 回答 2

2

您可能会遇到奇怪的错误消息,因为您将返回值命名为sns.catplotas axsns.catplot是一个“图形级”函数并返回一个FacetGrid,通常分配给一个名为 的变量g。图形级函数可以有一个或多个子图,可通过g.axes. 当只有一个子图时,g.ax指向该子图。

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

此外,您似乎正在混合 matplotlib 的“面向对象”和 pyplot 接口。为了可读性和代码维护,最好坚持一个界面。

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

这是从 seaborn 的 iris 数据集开始的一些示例代码。

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()

带有手段的猫图

于 2022-01-20T08:02:30.593 回答
-1

根据使用 matplotlib 面向对象接口作为catplot一种图使用 seaborn 进行绘图,与Figure-level其他一些类型的图相比,它比绘制要困难得多。

第二组函数(图形级别)的区别在于,结果图可能潜在地包括几个轴,这些轴总是以“有意义”的方式组织。这意味着函数需要完全控制图形,因此不可能将 lmplot 绘制到已经存在的图形上。调用该函数总是会初始化一个图形并将其设置为它正在绘制的特定绘图。

于 2022-01-20T00:38:33.827 回答