Вторая ось y и вертикальная линия - PullRequest
0 голосов
/ 01 ноября 2018

Я создаю скрипку с использованием следующего кода:

import seaborn as sns

ax = sns.violinplot(data=df[['SoundProduction','SoundForecast','diff']])
ax.set_ylabel("Sound power level [dB(A)]")

Это дает мне следующий результат:

violinplot

Можно ли как-нибудь нарисовать diff на второй оси y, чтобы все три серии стали отчетливо видны?

Кроме того, есть ли способ построить вертикальную линию между двумя сериями? В этом случае я хочу вертикальную линию между SoundForecast и diff, когда они нанесены на две разные оси.

1 Ответ

0 голосов
/ 01 ноября 2018

Этого можно добиться с помощью нескольких вспомогательных сюжетов, которые легко настраиваются с помощью plt.subplots (см. Множество других примеров вспомогательных участков ).

Это позволяет вам отображать ваши распределения в соответствующих масштабах и не «тратить» пространство дисплея. Большинство (все?) Из функций построения Seaborn принимают аргумент ax=, поэтому вы можете установить оси, на которых будет отображаться график. Оси также имеют четкое разделение между ними.

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# generate some random distribution data
n = 800 # samples
prod = 95 + 5 * np.random.beta(0.6, 0.5, size=n); # a bimodal distribution
forecast = prod + 3*np.random.randn(n) # forecast is noisy estimate around the "true" production
diff = prod-forecast  # should be with mu 0 sigma 3
df = pd.DataFrame(np.array([prod, forecast, diff]).T, columns=['SoundProduction','SoundForecast','diff']); 

# set up two subplots, with one wider than the other
fig, ax = plt.subplots(1,2, num=1,  gridspec_kw={'width_ratios':[2,1]})

# plot violin distribution estimates separately so the y-scaling makes sense in each group
sns.violinplot(data=df[['SoundProduction','SoundForecast']], ax=ax[0])
sns.violinplot(data=df[['diff']], ax=ax[1])

enter image description here

...