在matplotlib和seaborn之间共享x轴

时间:2018-08-28 13:06:32

标签: python matplotlib seaborn axis axis-labels

我在熊猫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)

壁虱标签存在问题,因为0.45的{​​{1}}的重叠点和线应位于0附近。

polt

我尝试了link1的许多解决方案, link2link3link4,但仍然无法正确设置两个图的轴。

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

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

pic

3 个答案:

答案 0 :(得分:4)

条形图中的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)

enter image description here

对于一般情况,您可以添加一个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仅作为刻度标签打印,因此它应该从头到尾线性排列。

关于x轴标签的问题:我只能说它没有出现在我的系统上,上述图的代码与您的图相同,除了垂直线。也许是在一次接连尝试vlines时引入的。

答案 1 :(得分:1)

使用ASP.NET Core和四舍五入输入:

ax.twiny

enter image description here

答案 2 :(得分:0)

创建具有两个子图的图形,然后可以在两个子图之间共享x和y轴。

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