微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。