Seaborn 小提琴图未按计数正确缩放

问题描述

我正在尝试按计数缩放我的小提琴图,但最后三把小提琴(每个都基于三个数据点)比前三个小提琴大得多,前三个小提琴基于更多。

我的代码如下:

fig = plt.figure(figsize=(20,10))
grid = plt.GridSpec(1,1,wspace=0.15,hspace=0)

plotol= fig.add_subplot(grid[0,0])
olivine = sns.violinplot(x=olivinedata.Sample,y=olivinedata.FoContent,scale='count',hue=olivinedata.RimCore,order=["85B","95B","98","LZa* (Tranquil)","LZa* (Banded)","LZb* ","LZa","LZb","LZc"],ax=plotol)
plotol.set_xticklabels(plotol.get_xticklabels(),rotation=20,fontsize = 15,horizontalalignment='right')
plotol.set_yticklabels(plotol.get_yticks(),size=15)


plotol.set_xlabel("Sample",size = 24,alpha=0.7)
plotol.set_ylabel("Fo# (mol. %)",alpha=0.7)
plt.setp(plotol.get_legend().get_texts(),fontsize='22')
plotol.legend(title="Measurement Type")

我也收到一条警告消息

用户警告:FixedFormatter 只能与 FixedLocator 一起使用 如果 sys.path[0] == '':

由于包含该行而产生的结果:

plotol.set_yticklabels(plotol.get_yticks(),size=15)

我不知道为什么。任何帮助表示赞赏!

Violin Plot

解决方法

您可能需要 scale_hue=False,否则按 x 类别进行缩放。

这是 scale 选项的比较,有和没有 scale_hue

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns

df1 = pd.DataFrame({'sample': np.repeat([*'ABC'],20),'hue': np.repeat([*'BBRBRB'],10),'val': np.random.uniform(10,20,60)})
df2 = pd.DataFrame({'sample': np.repeat([*'XYZ'],3),'hue': np.repeat([*'BBB'],9)})
fig,axes = plt.subplots(nrows=2,ncols=3,figsize=(24,8))
for row,scale_hue in zip([0,1],[True,False]):
    for ax,scale in zip(axes[row,:],['area','count','width']):
        sns.violinplot(data=pd.concat([df1,df2]),x='sample',y='val',hue='hue',scale=scale,scale_hue=scale_hue,ax=ax)
        ax.set_title(f"scale='{scale}',scale_hue={scale_hue}",size=16)
plt.tight_layout()
plt.show()

comparison violinplot scale count

相关问答

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