您可以使用 Python 在雨云图上将箱线图与半小提琴图重叠吗?

问题描述

我使用以下代码创建了一个雨云图:

#Rainplot

dx = 'Time Point'; dy = 'score'; ort = "v"; pal = "Set2"; sigma = .2; 

f,ax = plt.subplots(figsize=(7,5))

pt.RainCloud(x = dx,y = dy,data = df,palette = pal,bw = sigma,width_viol = .9,ax= ax,orient = ort,move = .2)

plt.title("")
plt.ylabel('score',fontsize = 20) 
plt.xlabel('',fontsize = 20) 
plt.grid(color = 'w')

if savefigs: 
    plt.savefig('/Users/zeidanlab/Desktop/gv/rainplots/figure_tsc.png',bBox_inches='tight')

Raincloud Plot

我想知道是否有办法让箱线图与分布 blob 重叠。

解决方法

这是一种将半小提琴图与箱线图和带状图结合起来的方法。

一半的小提琴是通过提取它们的边界框创建的,然后用它的一半来剪辑小提琴。

为了不重叠,条形图的点被移动。

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

sns.set_style('white')
tips = sns.load_dataset('tips')
palette = sns.cubehelix_palette(start=.5,rot=-.5,dark=0.3,light=0.7)
ax = sns.violinplot(y="day",x="total_bill",data=tips,palette=palette,scale="width",inner=None)
xlim = ax.get_xlim()
ylim = ax.get_ylim()
for violin in ax.collections:
    bbox = violin.get_paths()[0].get_extents()
    x0,y0,width,height = bbox.bounds
    violin.set_clip_path(plt.Rectangle((x0,y0),height / 2,transform=ax.transData))

sns.boxplot(y="day",saturation=1,showfliers=False,width=0.3,boxprops={'zorder': 3,'facecolor': 'none'},ax=ax)
old_len_collections = len(ax.collections)
sns.stripplot(y="day",color='dodgerblue',ax=ax)
for dots in ax.collections[old_len_collections:]:
    dots.set_offsets(dots.get_offsets() + np.array([0,0.12]))
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.show()

half violin with boxplot and stripplot

这是另一个例子,在垂直方向。

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

sns.set_style('white')
iris = sns.load_dataset('iris')
palette = 'Set2'
ax = sns.violinplot(x="species",y="sepal_length",data=iris,hue="species",dodge=False,width / 2,height,transform=ax.transData))

sns.boxplot(x="species",ax=ax)
old_len_collections = len(ax.collections)
sns.stripplot(x="species",ax=ax)
for dots in ax.collections[old_len_collections:]:
    dots.set_offsets(dots.get_offsets() + np.array([0.12,0]))
ax.set_xlim(xlim)
ax.set_ylim(ylim)
ax.legend_.remove()
plt.show()

half violin with boxplot,vertical

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...