【问题标题】:Seaborn: gridlines from secondary axis above data (with different ticks)Seaborn:数据上方辅助轴的网格线(具有不同的刻度)
【发布时间】:2019-01-22 04:27:03
【问题描述】:

我正在使用 seaborn 和 twinx 在一个图中绘制两条线。但是,如下所示,蓝线位于水平线下方,因为它被第二个图覆盖:

import seaborn as sns
import matplotlib.pyplot as plt
l1 = sns.lineplot(x=[0,1,2],y=[1,2,3],color="#0188A8")
ax1 = plt.gca()
ax2 = ax1.twinx()
l2 = sns.lineplot(x=[0,1,2], y=[100,200,300],color="#D42227")
plt.xlabel('Number of Selves',fontsize=13)
ax1.set_xticks([0,1,2])
ax1.set_yticks([0,1,2])
ax2.set_yticks([100,200,300])

做了一些谷歌搜索后,我发现this 很接近,但没有帮助。尝试他们的解决方案,轴刻度会被扭曲,因为两条线都绘制在第二个图上:

ax1 = plt.gca()
ax2 = ax1.twinx()
l1 = sns.lineplot(x=[0,1,2],y=[1,2,3],color="#0188A8")
l2 = sns.lineplot(x=[0,1,2], y=[100,200,300],color="#D42227")
plt.xlabel('Number of Selves',fontsize=13)
ax1.set_xticks([0,1,2])
ax1.set_yticks([0,1,2])
ax2.set_yticks([100,200,300])

我的问题是,蓝线如何位于水平网格线的顶部,同时保持刻度与第一张图片中的位置相同?

【问题讨论】:

    标签: python matplotlib seaborn


    【解决方案1】:

    您无法轻易获得想要的效果,因为ax2 的所有艺术家都绘制在ax1 的艺术家之上,而不管他们各自的z 顺序如何。

    我可以建议的唯一“好”解决方案是,正如您发现的那样,在ax2 上画两条线,但您必须对第一行使用ax1 的数据转换,以便它匹配左轴上的数字。

    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    ax2 = ax1.twinx()
    
    l1 = sns.lineplot(x=[0,1,2],y=[1,2,3],color="#0188A8", ax=ax2, transform=ax1.transData)
    l2 = sns.lineplot(x=[0,1,2], y=[100,200,300],color="#D42227", ax=ax2)
    
    ax1.set_xlabel('Number of Selves',fontsize=13)
    ax1.set_xticks([0,1,2])
    ax1.set_yticks([0,1,2])
    ax2.set_yticks([100,200,300])
    ax1.set_ylim(-0.5,3.5)
    

    请注意,由于ax1 上实际上没有数据,因此您必须手动指定 y 轴范围,它不会为您自动缩放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      相关资源
      最近更新 更多