2017-09-30 106 views
-1

编辑:我已经重写了这个问题,因为它不像它应该一样清楚。 我有两个数据集(df3和df4分别持有总头和效率的信息)与一个共同的自变量(流量)。 我正在寻找他们在同一个图中,但因变量有不同的Y轴。我最初使用lmplot来实现多项式阶次功能,但是这两个图都出现在一个窗口中是不成功的。我希望将我的散点图和回归图组合成一个显示数据集之间重叠的图。通过Seaborn双绘图X轴

我用以下方法来生成我的图表:

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)和效率%来了解泵的性能关系和后续降级情况。

我能想到的唯一的另一种方式是将多项式函数写成方程式,将其放入绘图函数中的参数中并将它们拉出来。我还没有尝试过这个,但是在我走下这条路之前,我想问问是否还有其他选择。

谢谢你的时间。

Scatter Plot

SOLUTION:对于那些有兴趣,我使用的.twinx()与如下regplot库。

fig, ax = plt.subplots() 
ax2 = ax.twinx() #This allows the common axes (flow rate) to be shared 
sbn.regplot(x="Flow_Rate_(KG/S)", y="Total Head", data=df3, order=2, ax=ax) 
sbn.regplot(x="Flow_Rate_(KG/S)", y="Efficiency_%", data=df4, order=2, 
ax=ax2) 
ax2.set_ylim(0,1)#This is used to set the limit for efficiency. Without this being set, the curves do not line up. 
+0

@ImportanceOfBeingErnest - 你是说有可能得到两个多项式我seaborn创建,在一个阴谋?我只是想知道除了我提出的建议之外是否还有其他选择。否则,我会尝试方程式。唯一的问题是解决方案需要一个固定的方程,但实际上,方程可能会改变。 – azurekirby

+0

@ImportanceOfBeingErnest - 感谢您提供有关如何改善我的问题的提示。我已经正式编辑它。我希望它能让我更清楚一点:)。 – azurekirby

+0

@ImportanceOfBeingErnest - 我已经尝试过您提供的方法,但由于某种原因,我的轴似乎无法识别'效率'y轴,但只能识别总头部。你会知道为什么会这样吗? – azurekirby

回答

1

让我尝试重组问题:你有两个数据集与普通独立的值,但不同的从属值(F(X),G(X)分别)。你想在同一个图表中绘制它们,但是相关值有完全不同的范围。因此,您希望有两个不同的y轴,每个数据集一个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() 

enter image description here

+0

从上面你还可以看到[mcve]是如何看起来像你可以使用这样的问题。 – ImportanceOfBeingErnest

+0

难以置信 - 这正是我所追求的!非常感谢!我会记下下一次如何改进我的问题。我不知道你可以在.regplot中使用ax = ax参数。我甚至不知道你可以使用order = 2这个函数 - 谢谢你教我一些新的东西!我非常感激! – azurekirby

+0

它通常有助于阅读[文档](https://seaborn.pydata.org/generated/seaborn.lmplot.html),它说*“此功能结合regplot()和FacetGrid。[...]理解regplot()和lmplot()之间的区别可能有点棘手,实际上它们是紧密相关的,因为lmplot()在内部使用regplot()并且占用了大部分参数。但是,regplot()因此它直接绘制到一个轴上(当前活动的轴或由ax参数提供的轴),而lmplot()是一个图形级函数[..]“* – ImportanceOfBeingErnest