我有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
我尝试了许多来自0
,x axis
,,link1的解决方案,但仍然问题设置正确的两个图的轴。
有什么问题?可能在图之间共享x轴吗?
预期输出 - 正确对齐的垂直线,也不在x轴上重叠刻度:
条形图中的x轴是分类的,因此它不具有link3的值作为实际比例,而仅作为刻度标签。你可以改变,例如link4除了最后一个标签之外什么都不会改变。
因此,分类轴意味着第一个柱的坐标为0,第二个柱的坐标为1,依此类推......最后一个为19。
我的方法是将垂直线设置为xpos * 19 / .95:
df.a
对于一般情况,您可以添加lambda函数来计算转换:
df.a[19] = 2
但是,由于plt.vlines(x = .45*19/.95, ymin = 0, ymax = 0.6, color = 'red', linewidth=5)
仅作为刻度标签打印,因此它应该从开始到结束呈线性。
关于x轴标记的问题:我只能告诉它没有出现在我的系统中,上图的代码与你的相同,除了垂直线。也许这是在一次又一次尝试vlines时引入的。
创建一个包含两个子图的图形,然后您可以在两个子图之间共享x轴和y轴。
ax.twiny