按物种划分的标准差图 - python

plot of the standard deviations by species - python

我正在尝试为物种开发一个标准的开发图,但所有等线的结果图并没有多大意义。有人可以告诉我发生这种情况是因为我做错了什么还是之前没有做吗?

而且我也不明白为什么它们在每个物种 50 个时达到 14 个

from sklearn.datasets import load_iris
import pandas as pd
import seaborn as sns
iris = load_iris()
iris_df=pd.DataFrame(iris.data, columns=iris.feature_names)
iris_df['species_id'] = iris.target
iris_df['species_id'] = iris_df['species_id'].replace([0,1,2],iris.target_names)
iris_df['x_pos'] = np.arange(len(iris_df))
print(iris_df)

plt.figure(figsize=(10,5))
ax = sns.barplot(x = "species_id", y = "x_pos", data = iris_df, estimator = np.std)
ax.set_xlabel("Frequency", fontsize = 10)
ax.set_ylabel("Species", fontsize = 10)
ax.set_title("Standard Deviation of Species", fontsize = 15)

你的论点 y=x_pos 是这里的问题,因为要评估例如 setosa 的数据将是 [0,1,..., 49, 50],这会导致 np.std(range(50)) = 14.43 的标准偏差。 np.std(range(50,100)) = 14.43np.std(range(100,150)) = 14.43.

也是如此

您要做的是按物种获取每次测量的标准偏差。这可以通过

完成
for cat in ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']:
    plt.figure(figsize=(10,5))
    ax = sns.barplot(x = "species_id", y = cat, data = iris_df, estimator = np.std)
    ax.set_xlabel("Frequency", fontsize = 10)
    ax.set_ylabel("Species", fontsize = 10)
    ax.set_title(f"Standard deviation of {cat} by species", fontsize = 15)

并生成一些漂亮的图

请注意,seaborn.barplot 不支持参数 y 的多个列名称。如果您愿意,可以在可能的情况下使用 pandas 重写整个内容。

iris_df = iris_df.drop('x_pos',axis=1)
iris_df.groupby('species_id').agg(np.std).plot.bar()

导致

x_pos 每行加 1。数据集按物种排序,每个物种有 50 个测量值,因此对于每个物种,您将获得相同的标准偏差。

以下情节有助于解释原因:

sns.scatterplot(x='x_pos', y=1, hue='species_id', data=iris_df)

从 0 到 49 的一系列整数的标准差与从 50 到 99 的一系列整数的标准差相同,依此类推。

更有趣的图是任何特征的标准差。示例:

ax = sns.barplot(
    x='species_id',
    y='sepal length (cm)',
    data=iris_df,
    estimator=np.std
)
ax.set_xlabel('Frequency', fontsize=10)
ax.set_ylabel('Species', fontsize=10)
ax.set_title('StdDev of Sepal Length', fontsize=15)