[英]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
附近。
我嘗試了來自link1 , link2 , link3 , link4的許多解決方案,但仍然無法正確設置兩個圖的軸。
怎么了 可以在圖之間共享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.