如何使用Matplotlib在python中创建不对称小提琴图

问题描述

我有以下两个示例数据集:

data = np.exp ( np.random.randn(N) ) 
data[data>threshold] = threshold + np.random.randn(sum(data>threshold))*0.2
data_1 = data
data_2 = np.random.randn(N)

我想知道如何使用Matplotlib plt.violinplot()创建一个不对称的小提琴图,其中两个数据集都绘制在同一轴的两侧。不幸的是,我无法为此功能找到合适的选项,因为该功能可用于statsmodels.graphics.Boxplots.violinplot(side=)seaborn库。
这是我的分开小提琴图的代码

import numpy as np
import matplotlib.pyplot as plt 

N = 10000
threshold = 5 

data = np.exp ( np.random.randn(N) ) 
data[data>threshold] = threshold + np.random.randn(sum(data>threshold))*0.2

data_1 = data
data_2 = np.random.randn(N)
plt.figure(figsize = (15,5))
plt.subplot(1,2,1)
plt.violinplot(data_1)
plt.title('Violin Plot For Dataset 1')

plt.subplot(1,2)[enter image description here][1]
plt.violinplot(data_2)
plt.title('Violin Plot For Dataset 2');

结果附后。 [1]:https://i.stack.imgur.com/hx0Ha.png

解决方法

您需要使用seaborn在数据框中转换数据。 split=参数将与hue嵌套一起使用,仅当您已有x=参数时才可使用。因此,您需要同时为x(两个数据集都应具有相同的值)和hue(根据数据集进行编码)提供列:

N=100
data_1 = np.random.normal(loc=1,size=N)
data_2 = np.random.normal(loc=2,size=N)

data = pd.DataFrame({'data_1':data_1,'data_2':data_2})
data = data.melt()
data['dummy'] = 0

sns.violinplot(data=data,y='value',split=True,hue='variable',x='dummy')

enter image description here

使用statsmodels.graphics.boxplots.violinplot需要进行两次调用,每个数据集都要进行一次调用

from statsmodels.graphics.boxplots import violinplot
fig,ax = plt.subplots()
violinplot([data_1],positions=[0],show_boxplot=False,side='left',ax=ax,plot_opts={'violin_fc':'C0'})
violinplot([data_2],side='right',plot_opts={'violin_fc':'C1'})

enter image description here

相关问答

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