2015-07-21 3 views
3

У меня есть два pandas dataframes Я хотел бы построить на этом же морском побережье jointplot. Это выглядит примерно так (команды надевают в IPython оболочки; ipython --pylab):Нанесение двух распределений в seaborn.jointplot

import pandas as pd 
import seaborn as sns 
iris = sns.load_dataset('iris') 
df = pd.read_csv('my_dataset.csv') 
g = sns.jointplot('sepal_length', 'sepal_width', iris) 

Ключи в двух dataframes идентичны.
Как мне отобразить мои значения в одном и том же сюжете (разумеется, разного цвета)? И даже более подробно: как мне построить оба набора данных, но только с распределением первого сверху и сбоку? То есть только зарисуйте точки.

+0

Я сомневаюсь, что это лучший способ, но вы можете использовать 'hue' вариант' pairplot', чтобы получить различные цвета (после первого слияния наборы данных). http://stanford.edu/~mwaskom/software/seaborn/examples/scatterplot_matrix.html – JohnE

+0

Кстати, теперь рекомендуется использовать '% matplotlib inline' после запуска ipython, а не ссылаться на' --pylab' – JohnE

+0

Что такое разница между '--pylab' и'% matplotlib inline'? –

ответ

13

Вот один из способов сделать это, изменив основные данные sns.JointGrid.

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

# simulate some artificial data 
# ======================================== 
np.random.seed(0) 
data1 = np.random.multivariate_normal([0,0], [[1,0.5],[0.5,1]], size=200) 
data2 = np.random.multivariate_normal([0,0], [[1,-0.8],[-0.8,1]], size=100) 

# both df1 and df2 have bivaraite normals, df1.size=200, df2.size=100 
df1 = pd.DataFrame(data1, columns=['x1', 'y1']) 
df2 = pd.DataFrame(data2, columns=['x2', 'y2']) 


# plot 
# ======================================== 
graph = sns.jointplot(x=df1.x1, y=df1.y1, color='r') 

graph.x = df2.x2 
graph.y = df2.y2 
graph.plot_joint(plt.scatter, marker='x', c='b', s=50) 

enter image description here

+0

Спасибо. Это работает отлично! :) –

+0

@DanielThaagaardAndreasen Добро пожаловать. Рад, что это помогло. :-) –

+7

Как вы можете показать второе распределение также на гистограммах сбоку? – user1834164

1

Это может быть проще, после нанесения jointplot, изменение оси, на которой вы хотите сделать что-то и использовать затем нормальные pyplot или оси на основе Сиборн участков:

g=sns.jointplot(...) 
plt.sca("axis_name") 
plt.plot/plt.scatter/.../sns.kde(ax="axis_name") 

Имя оси равно либо ax_joint для 2d-Plot, либо ax_marg_x или ax_marg_y для 1d-графиков сбоку.

Кроме того, если вы хотите использовать структуру совместного рисунка, но зарисуйте все графики с помощью pyplot, используйте функцию cla, например. для очистки 2d-Plot:

g.ax_joint.cla()

Смежные вопросы