简体   繁体   中英

Seaborn violin plot not scaling by count correctly

I am trying to scale my violin plot by count, but the three final violins, which are based on three data points each, are vastly bigger than the first three, which are based on many more.

My code is as follows:

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. %)",size = 24,alpha=0.7)
plt.setp(plotol.get_legend().get_texts(), fontsize='22')
plotol.legend(title="Measurement Type")

I am also getting a warning message

UserWarning: FixedFormatter should only be used together with FixedLocator if sys.path[0] == '':

which results from inclusion of the line:

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

and I have no idea why. Any help is appreciated!

小提琴剧情

You probably want scale_hue=False , otherwise the scaling acts per x category.

Here is a comparison of the scale options, with and without 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'], 3),
                    'val': np.random.uniform(10, 20, 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()

比较小提琴图比例计数

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM