gpt4 book ai didi

python - 如何在同一张图中使用 seaborn pointplot 和 violinplot? (更改点图的 xticks 和标记)

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:38 24 4
gpt4 key购买 nike

我正在尝试创建显示均值置信区间的 fiddle 图。我认为一个简单的方法是在 fiddle 图的顶部绘制一个点图,但这不起作用,因为它们似乎对 x 轴使用了不同的索引,如本例所示:

import matplotlib.pyplot as plt
import seaborn as sns

titanic = sns.load_dataset("titanic")
titanic.dropna(inplace=True)
fig, (ax1,ax2,ax3) = plt.subplots(1,3, sharey=True, figsize=(12,4))
#ax1
sns.pointplot("who", "age", data=titanic, join=False,n_boot=10, ax=ax1)
#ax2
sns.violinplot(titanic.age, groupby=titanic.who, ax=ax2)
#ax3
sns.pointplot("who", "age", data=titanic, join=False, n_boot=10, ax=ax3)
sns.violinplot(titanic.age, groupby=titanic.who, ax=ax3)
ax3.set_xlim([-0.5,4])

enter image description here

print(ax1.get_xticks(), ax2.get_xticks())

给出:[0 1 2] [1 2 3]

为什么这些图没有将相同的 xtick 数字分配给“who”变量,我有什么办法可以改变它吗?

我还想知道是否可以更改点图的标记,因为正如您在图中看到的那样,点太大以至于覆盖了整个置信区间。如果可能的话,我只想要一条水平线。

最佳答案

我在这里发布我的最终解决方案。我开始绘制这种图的原因是为了在同一图中显示有关分布形状、均值偏移和异常值的信息。通过 mwaskom 的指导和其他一些调整,我终于得到了我想要的东西。 enter image description here左边的图是与所有绘制成线的数据点的比较,右边的是我的最终图。 fiddle 中间的灰色粗线是均值的自举 99% 置信区间,即白色水平线,均来自点图。三条虚线是标准的第 25、50 和 75 个百分位数,外面的线是我在 fiddle 图上绘制的箱线图的 mustache 帽。各个数据点被绘制为超过这些点的线,因为我的数据通常有一些极端的数据点,我需要手动删除它们,例如下面 fiddle 中的两个点。

enter image description here

目前,除了这些增强的 fiddle 外,我还将继续制作直方图和箱线图,但我希望发现 fiddle 图中准确捕获了所有信息,并且我可以开始并依靠它作为我的主要初始数据探索图。这是生成图表的最终代码,以防其他人发现它们有用(或发现可以改进的地方)。对箱线图进行了大量调整。

import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns

#change the linewidth which to get a thicker confidence interval line
mpl.rc("lines", linewidth=3)
df = sns.load_dataset("titanic")
df.dropna(inplace=True)
x = 'who'
y = 'age'
fig, (ax1,ax2) = plt.subplots(1,2, sharey=True, figsize=(12,6))
#Left hand plot
sns.violinplot(df[y], groupby=df[x], ax=ax1, inner='stick')
#Right hand plot
sns.violinplot(df[y], groupby=df[x], ax=ax2, positions=0)
sns.pointplot(df[x],df[y], join=False, ci=99, n_boot=1000, ax=ax2, color=[0.3,0.3,0.3], markers=' ')
df.boxplot(y, by=x, sym='_', ax=ax2, showbox=False, showmeans=True, whiskerprops={'linewidth':0},
medianprops={'linewidth':0}, flierprops={'markeredgecolor':'k', 'markeredgewidth':1},
meanprops={'marker':'_', 'color':'w', 'markersize':6, 'markeredgewidth':1.5},
capprops={'linewidth':1, 'color':[0.3,0.3,0.3]}, positions=[0,1,2])
#One could argue that this is not beautiful
labels = [item.get_text() + '\nn=' + str(df.groupby(x).size().loc[item.get_text()]) for item in ax2.get_xticklabels()]
ax2.set_xticklabels(labels)
#Clean up
fig.suptitle('')
ax2.set_title('')
fig.set_facecolor('w')

编辑添加“n=”

关于python - 如何在同一张图中使用 seaborn pointplot 和 violinplot? (更改点图的 xticks 和标记),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27322650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com