2016-11-08 2 views
0

Я пытаюсь получить участок гексбина в Seaborn Grid. У меня есть следующий код,Участок Hexbin в PairGrid с морским транспортом

# Works in Jupyter with Python 2 Kernel. 
%matplotlib inline 

import seaborn as sns 
import matplotlib as mpl 
import matplotlib.pyplot as plt 

tips = sns.load_dataset("tips") 

# Borrowed from http://stackoverflow.com/a/31385996/4099925 
def hexbin(x, y, color, **kwargs): 
    cmap = sns.light_palette(color, as_cmap=True) 
    plt.hexbin(x, y, gridsize=15, cmap=cmap, extent=[min(x), max(x), min(y), max(y)], **kwargs) 

g = sns.PairGrid(tips, hue='sex') 
g.map_diag(plt.hist) 
g.map_lower(sns.stripplot, jitter=True, alpha=0.5) 
g.map_upper(hexbin) 

Однако, это дает мне следующее изображение, seaborn output

Как я могу исправить hexbin участки таким образом, чтобы они покрывали всю поверхность графика и не просто подмножество отображаемой площади участка?

+0

Вместо вниз голосования, пожалуйста, объясните, как я могу улучшить качество речи. Я был бы счастлив сделать это. – Stereo

+0

Возможно, это связано с тем, что у вас нет минимального рабочего примера. – GWW

+0

Обновлен код, спасибо! – Stereo

ответ

2

Существует (по крайней мере) три проблемы с тем, что вы пытаетесь сделать здесь.

  1. stripplot предназначен для данных, где по крайней мере одна ось является категориальной. В этом случае это неверно. Сиборн догадывается, что ось x является категоричной, которая испортит оси x ваших подзаговоров. От docs for stripplot:

    Нарисуйте диаграмму рассеяния, где одна переменная является категоричной.

    В предложенном ниже кодексе я изменил его на простой участок рассеяния.

  2. Рисование двух гексбинских сюжетов на вершине eachother будет показывать только последний. Я добавил некоторые аргументы alpha=0.5 в аргументы hexbin, но результат далеко не хорош.

  3. Параметр степени в коде скорректировали hexbin заговор x и y каждого пола по одному. Но оба участка гексбина должны быть равны по размеру, поэтому они должны использовать min/max всей серии за как полов. Для этого я передал минимальные и максимальные значения для всех серий в функцию hexbin, которые затем могут выбирать и использовать соответствующие.

Вот что я придумал:

# Works in Jupyter with Python 2 Kernel. 
%matplotlib inline 

import seaborn as sns 
import matplotlib as mpl 
import matplotlib.pyplot as plt 

tips = sns.load_dataset("tips") 

# Borrowed from http://stackoverflow.com/a/31385996/4099925 
def hexbin(x, y, color, max_series=None, min_series=None, **kwargs): 
    cmap = sns.light_palette(color, as_cmap=True) 
    ax = plt.gca() 
    xmin, xmax = min_series[x.name], max_series[x.name] 
    ymin, ymax = min_series[y.name], max_series[y.name] 
    plt.hexbin(x, y, gridsize=15, cmap=cmap, extent=[xmin, xmax, ymin, ymax], **kwargs) 

g = sns.PairGrid(tips, hue='sex') 
g.map_diag(plt.hist) 
g.map_lower(plt.scatter, alpha=0.5) 
g.map_upper(hexbin, min_series=tips.min(), max_series=tips.max(), alpha=0.5) 

И вот результат: enter image description here

+0

Спасибо за ваше объяснение, я забыл упомянуть, что я питон и новобранец. Я полностью буду думать о RTFM больше. Спасибо за красивое решение. – Stereo

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