更新了问题和代码!
技巧数据集可能不是最好的示例,但是我的问题在其中重现,即我们看到点图和条形图共享相同的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轴的任何解决方案将不胜感激
最佳答案
这是一个将自定义映射功能应用于目标数据框的示例。在函数内,您可以调用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中绘制两个不同幅度的系列。