Seaborn: линии сетки от вторичной оси над данными (с разными отметками) - PullRequest
0 голосов
/ 22 января 2019

Я использую 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])

enter image description here

После выполнения некоторыхпогуглив, я нашел этот , который был близко, но не помог.При попытке их решения тики оси будут искажены, так как обе линии нанесены на второй график:

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])

enter image description here

Мой вопрос такой,Как синяя линия может быть сверху горизонтальных линий сетки, сохраняя галочки в том же положении, что и на первом рисунке?

1 Ответ

0 голосов
/ 22 января 2019

Вы не можете легко получить желаемый эффект, потому что все художники 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, он не будет автоматически масштабироваться для вас.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...