python - Seaborn:数据上方辅助轴的网格线(具有不同的刻度)
问题描述
我正在使用 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])
在进行了一些谷歌搜索后,我发现这很接近,但没有帮助。尝试他们的解决方案,轴刻度会被扭曲,因为两条线都绘制在第二个图上:
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])
我的问题是,蓝线如何位于水平网格线的顶部,同时保持刻度与第一张图片中的位置相同?
解决方案
您无法轻松获得所需的效果,因为 的所有艺术家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 轴范围,它不会为您自动缩放。
推荐阅读
- python - 制作神经网络实例并使用 for 循环训练它们以获得不同的学习率。第二个实例以后总是卡住
- oracle - PL/SQL - 让变量表现为源代码
- mysql - Yii2:支持 MySQL 和 PostgreSQL
- html - 悬停时的 CSS 更改
- nsis - 使用 NSIS 卸载 windows 安装程序时,我需要在卸载程序屏幕之前提示一个消息框(您确定要卸载吗?)
- javascript - 在插件函数上创建 setTimeout
- javascript - 如何在 ng-table 上设置/获取显示的行数
- php - 在不创建虚拟主机的情况下阻止来自外部的 wamp 主页访问
- c++ - 如何在模板项成员上显式调用析构函数
- gerrit - 控制对我的 Gerrit 插件的 REST 操作的访问