2017-09-30 105 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