在matplotlib和seaborn之间共享x轴

问题描述 投票:1回答:3

我有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)

蜱标签存在问题,因为重叠并且线也应该在点qazxsw poi而不是qazxsw poi附近为qazxsw poi。

0.45

我尝试了许多来自0x axispoltlink1的解决方案,但仍然问题设置正确的两个图的轴。

有什么问题?可能在图之间共享x轴吗?

预期输出 - 正确对齐的垂直线,也不在x轴上重叠刻度:

link2

python matplotlib seaborn axis axis-labels
3个回答
4
投票

条形图中的x轴是分类的,因此它不具有link3的值作为实际比例,而仅作为刻度标签。你可以改变,例如link4除了最后一个标签之外什么都不会改变。

因此,分类轴意味着第一个柱的坐标为0,第二个柱的坐标为1,依此类推......最后一个为19。

我的方法是将垂直线设置为xpos * 19 / .95:

pic

df.a

对于一般情况,您可以添加lambda函数来计算转换:

df.a[19] = 2

但是,由于plt.vlines(x = .45*19/.95, ymin = 0, ymax = 0.6, color = 'red', linewidth=5) 仅作为刻度标签打印,因此它应该从开始到结束呈线性。

关于x轴标记的问题:我只能告诉它没有出现在我的系统中,上图的代码与你的相同,除了垂直线。也许这是在一次又一次尝试vlines时引入的。


1
投票

使用enter image description here和舍入输入:

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


0
投票

创建一个包含两个子图的图形,然后您可以在两个子图之间共享x轴和y轴。

ax.twiny
© www.soinside.com 2019 - 2024. All rights reserved.