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