2017-01-22 3 views
0

Я хотел бы переопределить swarmplot и regplot на морском дне, чтобы у меня могла быть линия y = x через мой swarmplot.Overplot seaborn regplot и swarmplot

import matplotlib.pyplot as plt 
import seaborn as sns 

sns.regplot(y=y, x=x, marker=' ', color='k') 
sns.swarmplot(x=x_data, y=y_data) 

У меня нет ошибок при создании графика, но regplot никогда не отображается на графике. Как я могу это исправить?

plot

EDIT: Мой regplot и swarmplot не overplot и вместо этого, участок в том же кадре, но отделены друг от неопределенной у суммы. Если я переверну их, поэтому regplot выше вызова на swarmplot, regplot вообще не появляется.

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

df = pd.DataFrame({"x":x_data,"y":y_data}) 

sns.regplot(y="y", x="x", data= df, color='k', scatter_kws={"alpha" : 0.0}) 
sns.swarmplot(y="y", x="x", data= df) 

updated plot

ВТОРОЙ EDIT: Двойное решение ось снизу прекрасно работает!

+0

Ось x в swarmplot является категоричной, а не количественной. Почему вы пытаетесь это сделать? – mwaskom

+0

Я хочу показать тенденции в swarmplot. – morepenguins

+1

Это не отвечает на вопрос. Вам нужно больше думать о том, что вы пытаетесь сделать. – mwaskom

ответ

0

В принципе, подход к построению плавника и реглота имитационно отлично работает.

Проблема в том, что вы установили пустой маркер (marker = " "). Это разрушает regplot, так что он не показан. По-видимому, это только проблема при построении нескольких вещей на одном графике; построение единственного regplot с пустым маркером отлично работает.

Решение было бы не указывать аргумент маркера, а вместо этого устанавливать маркеры невидимыми с использованием аргумента scatter_kws: scatter_kws={"alpha" : 0.0}.

Вот полный пример:

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

## generate some data 
n=19; m=9 
y_data = [] 
for i in range(m): 
    a = (np.random.poisson(lam=0.99-float(i)/m,size=n)+i*.9+np.random.rand(1)*2) 
    a+=(np.random.rand(n)-0.5)*2 
    y_data.append(a*m) 
y_data = np.array(y_data).flatten() 
x_data = np.floor(np.sort(np.random.rand(n*m))*m) 
## put them into dataframe 
df = pd.DataFrame({"x":x_data,"y":y_data}) 

## plotting 
sns.regplot(y="y", x="x", data= df, color='k', scatter_kws={"alpha" : 0.0}) 
sns.swarmplot(x="x", y="y", data= df) 

plt.show() 

enter image description here


Относительно отредактированной части вопроса:
Поскольку swarmplot является категорическим участок, ось на графике все еще идет от - От 0,5 до 8,5, а не от меток от 10 до 18. Возможным обходным путем является использование двух осей и twiny.

fig, ax = plt.subplots() 
ax2 = ax.twiny() 
sns.swarmplot(x="x", y="y", data= df, ax=ax) 
sns.regplot(y="y", x="x", data= df, color='k', scatter_kws={"alpha" : 0.0}, ax=ax2) 
ax2.grid(False) #remove grid as it overlays the other plot 
+0

Это работает со скрипкой и regplot, но не с swarmplot и regplot. – morepenguins

+0

Как я уже сказал, я не мог проверить его с помощью морского транспорта> 0.7.dev. Что происходит при использовании swarmplot вместо скриптинга в моем примере? Тот же вопрос, что и в вопросе? – ImportanceOfBeingErnest

+0

Я теперь переделал решение, которое использует swarmplot. Это на самом деле то же самое, что и до использования скрипки, поэтому нет никакой разницы. – ImportanceOfBeingErnest