簡體   English   中英

在matplotlib和seaborn之間共享x軸

[英]Share x axis between matplotlib and seaborn

我在pandas DataFrame有數據:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

np.random.seed(786)

df = pd.DataFrame({'a':np.arange(0, 1, 0.05),
                   'b':np.random.rand(20) - .5})

print (df)
       a         b
0   0.00  0.256682
1   0.05 -0.192555
2   0.10  0.393919
3   0.15 -0.113310
4   0.20  0.373855
5   0.25 -0.423764
6   0.30 -0.123428
7   0.35 -0.173446
8   0.40  0.440818
9   0.45 -0.016878
10  0.50  0.055467
11  0.55 -0.165294
12  0.60 -0.216684
13  0.65  0.011099
14  0.70  0.059425
15  0.75  0.145865
16  0.80 -0.019171
17  0.85  0.116984
18  0.90 -0.051583
19  0.95 -0.096527

我想繪制barplot並添加垂直線:

plt.figure(figsize=(10,5))
sns.barplot(x = 'a', y = 'b', data = df)
plt.vlines(x = 0.45, ymin = 0, ymax = 0.6, color = 'red', linewidth=5)

ticklabel存在問題,因為x axis重疊線也應在0.45點處穩定在0附近。

lt

我嘗試了來自link1link2link3link4的許多解決方案,但仍然無法正確設置兩個圖的軸。

怎么了 可以在圖之間共享x軸嗎?

預期的輸出-垂直線正確對齊,並且x軸上的刻度不重疊:

圖片

條形圖中的x軸是分類的,因此它沒有df.a的值作為真實比例,而僅作為刻度標簽。 您可以更改例如df.a[19] = 2 ,除了最后一個刻度線的標簽,其他都不會更改。

因此,分類軸表示第一個小節的坐標為0,第二個小節為1,依此類推...最后一個為19。

然后,我的方法是將垂直線設置為xpos * 19 / .95:

plt.vlines(x = .45*19/.95, ymin = 0, ymax = 0.6, color = 'red', linewidth=5)

在此處輸入圖片說明

對於一般情況,您可以添加一個lambda函數來計算轉化:

f = lambda x: (x-df.a.values[0]) * (df.a.size-1) / (df.a.values[-1] - df.a.values[0])
plt.vlines(x = f(.45), ymin = 0, ymax = 0.6, color = 'red', linewidth=5)

但是,由於df.a.values僅作為刻度標簽打印,因此它應該df.a.values線性變化。

關於x軸標簽的問題:我只能說它沒有出現在我的系統上,除了垂直線外,上面的繪圖代碼與您的代碼相同。 也許是在一次接連嘗試vlines時引入的。

使用ax.twiny和舍入輸入:

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

df = pd.DataFrame({'a':np.round(np.arange(0, 1, 0.05),2),
                   'b':np.round(np.random.rand(20),2) - .5})


plt.figure(figsize=(10,5))
ax = sns.barplot(x = 'a', y = 'b', data = df)
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
ax2 = ax.twiny()
ax2.vlines(x = 0.45, ymin = 0, ymax = 0.6, color = 'red', linewidth=2)
#ax2.set_visible(False) # this hides the ticks on the top of the plot

在此處輸入圖片說明

創建具有兩個子圖的圖形,然后可以在兩個子圖之間共享x和y軸。

fig = plt.figure()
ax1 = plt.subplot(211)
ax2 = plt.subplot(212, sharex = ax1, sharey = ax1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM