【问题标题】:Combining FacetGrid and dual Y-axis in Pandas在 Pandas 中结合 FacetGrid 和双 Y 轴
【发布时间】:2017-04-10 01:34:54
【问题描述】:

我正在尝试在单个 FacetGrid 上绘制两个不同的变量(通过因果关系链接)delai_jourdate_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")

这给了我这个:

FacetGrid

(总共有 33 个)。

我有兴趣比较各种prefecture 的模式,但由于幅度不同,我看不到折线图中的变化。

对于这项特定的工作,最好的方法是创建一个辅助 y 轴,但我似乎无法使任何工作:FacetGrid 看起来不可能,我不明白代码无法复制我在纯 matplotlib 中看到的示例。

我应该怎么做?

【问题讨论】:

  • 我不同意“最好的方法是创建辅助 y 轴”的说法。那是one of the worst ways
  • 感谢您的文章。我认为有一个误解:我并不是说在所有情况下第二个轴都更好。我的意思是,对于我的情况,即直观地探索通过因果关系链接的 2 个变量的模式,这是最节省空间和视觉效率的方式。但我会编辑我的帖子以使其更清晰。
  • 这正是文章中描述的应用程序。使用具有两个轴的平行时间序列来显示“因果关系”可能会产生高度误导,因为明显关系的程度很大程度上受任意 y 轴缩放控制。
  • 我不是在寻找因果关系。我知道有一个。我不是在比较一个图表中的模式,而是比较 33 个方面的共同模式。

标签: python pandas matplotlib seaborn facet


【解决方案1】:

这是一个将自定义映射函数应用于感兴趣的数据框的示例。在该函数中,您可以调用plt.gca() 以获取当前在 FacetGrid 中绘制的刻面的当前轴。一旦有了轴,就可以像在普通的旧 matplotlib 绘图中一样调用 twinx()

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 轴标签的存在、图之间的间距等,但代码足以显​​示如何在 FacetGrids 中绘制两个不同幅度的序列.

【讨论】:

    【解决方案2】:

    我通过遍历轴并绘制辅助轴来实现这一点,就像在典型的 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 进行格式化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 2020-12-21
      • 2022-06-14
      • 2022-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多