Python 熊猫中FacetGrid和双Y轴的组合

Python 熊猫中FacetGrid和双Y轴的组合,python,pandas,matplotlib,seaborn,facet,Python,Pandas,Matplotlib,Seaborn,Facet,我试图在一个平面网格上绘制两个不同的变量(通过因果关系链接),delai_jour和date_sondage。我可以使用以下代码执行此操作: g = sns.FacetGrid(df_verif_sum, col="prefecture", col_wrap=2, aspect=2, sharex=True,) g = g.map(plt.plot, "date_sondage", "delai_jour", color="m", linewidth=2) g = g.map(plt.bar,

我试图在一个平面网格上绘制两个不同的变量(通过因果关系链接),
delai_jour
date_sondage
。我可以使用以下代码执行此操作:

g = sns.FacetGrid(df_verif_sum, col="prefecture", col_wrap=2, aspect=2, sharex=True,)
g = g.map(plt.plot, "date_sondage", "delai_jour", color="m", linewidth=2)
g = g.map(plt.bar, "date_sondage", "impossible")
这就给了我:

(总共有33个)

我对比较各个
地区的模式很感兴趣,但由于大小不同,我看不到折线图中的变化

对于这个特定的工作,最好的方法是创建一个第二个y轴,但我似乎无法使任何东西起作用:FacetGrid看起来不可能,而且我不理解代码无法复制我在纯matplotlib中看到的示例


我应该怎么做呢?

下面是一个示例,您可以将自定义映射函数应用于感兴趣的数据帧。在函数中,您可以调用
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.plot(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轴标签的存在、绘图之间的间距等。但代码足以说明如何在FacetGrid中绘制两个不同大小的系列


下面是一个示例,您可以将自定义映射函数应用于感兴趣的数据帧。在函数中,您可以调用
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.plot(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轴标签的存在、绘图之间的间距等。但代码足以说明如何在FacetGrid中绘制两个不同大小的系列


我知道这很老了,但我也在尝试做类似的事情。我通过迭代轴并绘制一个次轴来实现这一点,就像典型的Seaborn图一样

使用OP示例:

g = sns.FacetGrid(df_verif_sum, col="prefecture", col_wrap=2, aspect=2, sharex=True)
g = g.map(plt.plot, "date_sondage", "delai_jour", color="m", linewidth=2)
for ax, (_, subdata) in zip(g.axes, df_verif_sum.groupby('prefecture'):
    ax2=ax.twinx()
    subdata.plot(x='data_sondage',y='impossible', ax=ax2,legend=False,color='r')

如果对x轴进行任何格式化,则可能必须同时对ax和ax2进行格式化。

我知道这是旧的,但我正在尝试进行类似的操作。我通过迭代轴并绘制一个次轴来实现这一点,就像典型的Seaborn图一样

使用OP示例:

g = sns.FacetGrid(df_verif_sum, col="prefecture", col_wrap=2, aspect=2, sharex=True)
g = g.map(plt.plot, "date_sondage", "delai_jour", color="m", linewidth=2)
for ax, (_, subdata) in zip(g.axes, df_verif_sum.groupby('prefecture'):
    ax2=ax.twinx()
    subdata.plot(x='data_sondage',y='impossible', ax=ax2,legend=False,color='r')

如果对x轴进行任何格式化,则可能必须同时对ax和ax2进行格式化。

我不同意“最好的方式是创建辅助y轴”的说法。谢谢你的文章。我认为这是一个误解:我并不是说在所有情况下,第二轴都更好。我想说的是,对于我的案例来说,这是视觉上探索由因果关系连接的两个变量的模式,这是最具空间和视觉效率的方式。但我会编辑我的帖子,让它更清晰。这正是文章中描述的应用程序。使用具有两个轴的平行时间序列来显示“因果关系”可能会产生很大的误导,因为明显关系的程度在很大程度上受任意y轴缩放的控制。我并不试图找到因果关系。我知道有一个。我不是比较一张图中的模式,而是比较33个面上的共同模式。我不同意“最好的方法是创建一个第二个y轴”的说法。谢谢你的文章。我认为这是一个误解:我并不是说在所有情况下,第二轴都更好。我想说的是,对于我的案例来说,这是视觉上探索由因果关系连接的两个变量的模式,这是最具空间和视觉效率的方式。但我会编辑我的帖子,让它更清晰。这正是文章中描述的应用程序。使用具有两个轴的平行时间序列来显示“因果关系”可能会产生很大的误导,因为明显关系的程度在很大程度上受任意y轴缩放的控制。我并不试图找到因果关系。我知道有一个。我不是比较一张图中的模式,而是比较33个方面的共同模式。