Python.Используйте две оси Y для линейных и линейных графиков на Seaborn Facetgrid - PullRequest
0 голосов
/ 23 октября 2018

Обновленный вопрос и код! Вероятно, набор данных подсказок - не лучший пример для использования, однако моя проблема воспроизведена в нем, то есть мы видим, что точечные и гистограммы имеют одинаковый Y

Мне нужно объединить линейные и линейные графики на одном графике.Для этого я использовал seaborn и следующий код:

tips = sns.load_dataset('tips')

g = sns.FacetGrid(tips, hue='sex', col='sex', size=4, aspect=2.1, sharey=False, sharex=False)

g = g.map(sns.pointplot, 'day', 'tip', ci=0)
g = g.map(sns.barplot, 'day', 'total_bill', ci=0)

g.set_xticklabels(rotation=45, fontsize=9)
g.set_xticklabels(rotation=45, fontsize=9)

plt.show()

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

Все в порядке, за исключением того, что одна ось Yиспользуется как для стержней, так и для линий на каждом объекте сетки граней.Я новичок в Seaborn и в настоящее время не могу найти решение.Попытка добавить "sharey = False" к этой строке кода

> `g.map(sns.pointplot, 'date', 'worthusdcount')`

, однако это не помогло.

Любые решения о том, как добавить вторую ось Y, будут оценены

1 Ответ

0 голосов
/ 04 января 2019

Вот пример, где вы применяете пользовательскую функцию отображения к интересующему фрейму данных.Внутри функции вы можете вызвать plt.gca(), чтобы получить текущую ось в фасете, который в данный момент отображается в FacetGrid.Если у вас есть ось, twinx() можно вызывать так же, как и в простой старой графике matplotlib.

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

def facetgrid_two_axes(*args, **kwargs):
    data = kwargs.pop('data')
    dual_axis = kwargs.pop('dual_axis')
    alpha = kwargs.pop('alpha', 0.2)
    kwargs.pop('color')
    ax = plt.gca()
    if dual_axis:
        ax2 = ax.twinx()
        ax2.set_ylabel('Second Axis!')

    ax.plot(data['x'],data['y1'], **kwargs, color='red',alpha=alpha)
    if dual_axis:
        ax2.bar(df['x'],df['y2'], **kwargs, color='blue',alpha=alpha)


df = pd.DataFrame()
df['x'] = np.arange(1,5,1)
df['y1'] = 1 / df['x']
df['y2'] = df['x'] * 100
df['facet'] = 'foo'
df2 = df.copy()
df2['facet'] = 'bar'

df3 = pd.concat([df,df2])
win_plot = sns.FacetGrid(df3, col='facet', size=6)
(win_plot.map_dataframe(facetgrid_two_axes, dual_axis=True)
         .set_axis_labels("X", "First Y-axis"))
plt.show()

Это не самый красивый график, так как вы можете настроить наличие второго yметка оси, расстояние между графиками и т. д., но кода достаточно, чтобы показать, как построить две серии различных величин в FacetGrids.

seaborn_double_y_axis

...