【问题标题】:Dual Plotting X-Axis via Seaborn通过 Seaborn 绘制 X 轴双绘图
【发布时间】:2018-03-12 07:08:05
【问题描述】:

我有 2 个数据集(df3 和 df4,它们分别保存总水头和效率的信息),它们有一个共同的自变量(流速)。

我希望将它们都绘制在同一张图中,但因变量具有不同的 y 轴。我最初将lmplot() 用于多项式顺序功能,但在一个窗口中显示两个图时并不成功。我需要帮助将我的散点图和回归图合并到一个图中,显示数据集之间的重叠。

我使用以下方法生成图表:

ax2.scatter(df3['Flow_Rate_(KG/S)'], df2['Efficiency_%'], color='pink')
ax2.scatter(df4['Flow_Rate_(KG/S)'], df4['Total Head'], color='teal')
plt.show()

将线相互绘制很重要的原因是,为了监控泵的性能,我们需要同时了解泵的总扬程 (M) 和效率 % 以了解关系和随后的退化性能。

我能想到的唯一其他方法是将多项式函数编写为方程,以放入绘图函数的参数中,然后将它们绘制出来。我还没有尝试过这个,但我想在我走这条路之前我会问是否还有其他选择。

【问题讨论】:

  • @ImportanceOfBeingErnest - 你是说我在 seaborn 中创建的两个多项式可以在一个图中得到吗?我只是想知道除了我建议的之外是否还有其他选择。否则,我会尝试方程方法。唯一的问题是解决方案需要一个固定的方程,而实际上,方程可能会改变。
  • @ImportanceOfBeingErnest - 感谢您提供有关如何改进我的问题的提示。我已经对其进行了适当的编辑。我希望它能让我所追求的更清楚:)。
  • @ImportanceOfBeingErnest - 我已经尝试过您提供的方法,但由于某种原因,我的轴似乎无法识别“效率”y 轴,而只能识别总头。你知道为什么会这样吗?
  • 嗨 @ImportanceOfBeingErnest - 我通过 ax2.set_ylim(0,1) 设置 y 轴解决了我之前的问题。感谢您之前的帮助!
  • 是的,我认为regplot 以某种方式阻止了数字自动缩放。手动设置ylim 是一个简单的解决方案。

标签: python matplotlib plot seaborn


【解决方案1】:

让我尝试重新表述这个问题:您有两个具有共同独立值的数据集,但依赖值不同(分别为 f(x)、g(x))。您想将它们都绘制在同一张图中,但是从属值具有完全不同的范围。因此,您希望有两个不同的 y 轴,每个数据集一个。数据应绘制为散点图,并应为每个数据显示回归线;您对查看回归线比了解或计算回归曲线本身更感兴趣。因此,您尝试使用 seaborn lmplot,但未能将两个数据集放入同一个图中。

如果以上是您要解决的问题,答案可能如下。

lmplot 本质上将regplot 绘制到轴网格。因为您在这里不需要那个轴网格,所以使用regplot 可能更有意义。然后,您可以创建一个轴和一个双轴,并为每个轴绘制一个 regplot。

import numpy as np; np.random.seed(42)
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df1 = pd.DataFrame({"x": np.sort(np.random.rand(30)),
                    "f": np.sort(np.random.rayleigh(size=30))})
df2 = pd.DataFrame({"x": np.sort(np.random.rand(30)),
                    "g": 500-0.1*np.sort(np.random.rayleigh(20,size=30))**2})

fig, ax = plt.subplots()
ax2 = ax.twinx()
sns.regplot(x="x", y="f", data=df1, order=2, ax=ax)
sns.regplot(x="x", y="g", data=df2, order=2, ax=ax2)


ax2.legend(handles=[a.lines[0] for a in [ax,ax2]], 
           labels=["f", "g"])
plt.show()

【讨论】:

  • 从上面你还可以看到minimal reproducible example 的样子,你可以用它来回答这样的问题。
  • 难以置信——这正是我所追求的!太感谢了!下次我会注意如何改进我的问题。我不知道您可以在 .regplot 中使用 ax=ax 参数。我什至不知道您可以在该功能中使用 order=2 - 感谢您教我一些新东西!非常感谢!
  • 阅读the documentation 通常会有所帮助,上面写着 "此函数结合了 regplot() 和 FacetGrid。[...] 了解 regplot() 和 lmplot() 之间的区别可能有点棘手。实际上,它们密切相关,因为 lmplot() 在内部使用 regplot() 并获取其大部分参数。但是,regplot() 是轴级函数,因此它直接绘制到轴上(当前活动的轴或由 ax 参数提供的轴),而 lmplot() 是图形级函数 [..]"
猜你喜欢
  • 2021-09-27
  • 2019-08-09
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
相关资源
最近更新 更多