Python。在 Seaborn Facetgrid 上使用两个 y 轴绘制线图和条形图

Posted

技术标签:

【中文标题】Python。在 Seaborn Facetgrid 上使用两个 y 轴绘制线图和条形图【英文标题】:Python. Use two y axis for line and bar plots on Seaborn Facetgrid 【发布时间】:2019-03-27 12:07:42 【问题描述】:

更新了问题和代码! 提示数据集可能不是最好的示例,但是我的问题在其中重现,即我们看到点图和条形图共享相同的 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()

结果如下:

除了每个 facetgrid 对象上的条和线都使用一个 Y 轴这一事实之外,一切都很好。我是 seaborn 新手,目前找不到解决方案。尝试在这行代码中添加“sharey=False”

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

但它没有帮助。

任何关于如何添加第二个 Y 轴的解决方案将不胜感激

【问题讨论】:

你能发布一些示例数据吗? 与this one 相同的问题。从中你也可以推断出这个人的命运:没有minimal reproducible example,它可能在2年内都得不到答案。 更新了问题和代码。请重新检查它,请@ImportanceOfBeingErnest 这能回答你的问题吗? Seaborn FacetGrid plot two different y axis next to eachother 【参考方案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.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 中绘制两个不同幅度的序列.

【讨论】:

以上是关于Python。在 Seaborn Facetgrid 上使用两个 y 轴绘制线图和条形图的主要内容,如果未能解决你的问题,请参考以下文章

Python seaborn大更新,带来全新绘图方式seaborn.objects

Python seaborn大更新,带来全新绘图方式seaborn.objects

Python Seaborn swarmplot躲闪的顺序

Python使用seaborn可视化分组条形图并且在分组条形图的条形上添加数值标签(seaborn grouped bar plot add labels)

在图例中使用不同的颜色和形状 [Seaborn,Python]

在 Seaborn 中绘图时 Python 代码出错