python - 在 matplotlib 和 seaborn 之间共享 x 轴
问题描述
我在熊猫中有数据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)
刻度标签存在问题,因为重叠和线应该在for0.45
附近。0
x axis
我尝试了许多来自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
仅打印为刻度标签,因此它应该从头到尾呈线性排列。
关于 x 轴标记的问题:我只能说它没有出现在我的系统中,上面的绘图代码与您的相同,除了垂直线。也许它是在一次又一次尝试 vlines 时引入的。
推荐阅读
- php - 渲染数组中的单个数据
- c++ - 优化级别为 0 的 std::vector 调用了两次析构函数
- mongodb - Rocketchat - localhost:3000 即使在解决了大部分问题后也无法正常工作
- excel - 如何在 Web 源代码中选择第 n 次出现
- reactjs - 反应本机 TouchableOpacity 不能与里面的图标一起工作
- json - json 数据的 D3.js 热图
- android - RecyclerView 高度展开和折叠?
- dependency-injection - 如果依赖项仅在单个方法中使用,我应该注入它还是使用服务位置?
- web-applications - 使用 TFS 2018 (TFVC) 处理带有 CI / CD 的 .net Web 应用程序
- javascript - 在 webview 中加载页面后,Javascript 调用 java 方法不能立即工作?