Координаты курсора тетради matplotlib на графике с двойной осью y - PullRequest
0 голосов
/ 10 марта 2020

Я хотел бы, чтобы вы выяснили вопрос о появлении координат на графике matplotlib с двойной осью y. Прежде всего, код на Jupyter Notebook, который создает aws график с двумя линиями и только одной осью Y (по некоторым неизвестным причинам мне нужно запустить его два раза, чтобы заставить его работать правильно)

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab

from IPython.display import display 
from IPython.core.display import display, HTML #display multiple output on a cell 
display(HTML("<style>.container { width:100% !important; }</style>")) # improve cells horizontal size
from IPython.core.interactiveshell import InteractiveShell # It saves you having to repeatedly type "Display"
InteractiveShell.ast_node_interactivity = "all"
%matplotlib notebook

x = np.arange(0, 10, 0.01)
y1 = np.sin(np.pi*x)/(np.pi*x)
y2 = abs(np.tan(0.1*np.pi*x))

plt.figure()
plt.plot(x, y1)
plt.plot(x, y2)
plt.ylim(0, 3)
plt.grid()
plt.show()

enter image description here

На данном рисунке две строки с координатами курсора находятся в правой нижней части графика.

Следующий код

import pandas as pd
import os
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab

from IPython.display import display 
from IPython.core.display import display, HTML #display multiple output on a cell 
display(HTML("<style>.container { width:100% !important; }</style>")) # improve cells horizontal size
from IPython.core.interactiveshell import InteractiveShell # It saves you having to repeatedly type "Display"
InteractiveShell.ast_node_interactivity = "all"
%matplotlib notebook

x = np.arange(0, 10, 0.01)
y1 = np.sin(np.pi*x)/(np.pi*x)
y2 = abs(np.tan(0.1*np.pi*x))

# Create some mock data
fig, ax1 = plt.subplots()
plt.grid()
color = 'tab:red'
ax1.set_xlabel('Time (days from 24 February)')
ax1.set_ylabel('Death cases/Intensive care', color=color)
#ax1.set_xlim(0, 15)
#ax1.set_ylim(0, 900)
ax1.plot(x, y1, '-', color=color, label = 'Left hand scale')
ax1.tick_params(axis='y', labelcolor=color)
ax1.legend(loc = 'upper left')

ax2 = ax1.twinx()  

color = 'tab:blue'
ax2.set_ylabel('Total cases/currently positive', color=color)  # we already handled the x-label with ax1
ax2.plot(x, y2, '-', color=color, label = 'Right hand scale')
ax2.set_ylim(0, 20)
ax2.tick_params(axis='y', labelcolor=color)
ax2.legend(loc = 'lower right')

fig.tight_layout()  

plt.show()

Показывает следующий график

enter image description here

, который показывает график с двумя шкалами y, один красный слева и один синий справа сторона. Проблема здесь в том, что в левой нижней части изображения есть координаты курсора, связанные с правым масштабом, и ничего о левом. Есть ли способ показать обе шкалы?

1 Ответ

0 голосов
/ 10 марта 2020

В зависимости от ваших конкретных потребностей, mplcursors кажется полезным. Mplcursors предоставляет множество способов настройки, например, вы можете показать оба значения y вместе с текущим x. Или вы можете подавить аннотацию и писать только в строке состояния.

Настройка hover=True постоянно отображает отображаемые значения при наведении курсора мыши на кривую. По умолчанию значения отображаются только при нажатии.

import matplotlib.pyplot as plt
import numpy as np
import mplcursors

# Create some test data
x = np.arange(0, 10, 0.01)
y1 = np.sin(np.pi * x) / (np.pi * x)
y2 = abs(np.tan(0.1 * np.pi * x))

fig, ax1 = plt.subplots()
plt.grid()
color = 'tab:red'
ax1.set_xlabel('Time (days from 24 February)')
ax1.set_ylabel('Death cases/Intensive care', color=color)
lines1 = ax1.plot(x, y1, '-', color=color, label='Left hand scale')
ax1.tick_params(axis='y', labelcolor=color)
ax1.legend(loc='upper left')

ax2 = ax1.twinx()
color = 'tab:blue'
ax2.set_ylabel('Total cases/currently positive', color=color)  # we already handled the x-label with ax1
lines2 = ax2.plot(x, y2, '-', color=color, label='Right hand scale')
ax2.set_ylim(0, 20)
ax2.tick_params(axis='y', labelcolor=color)
ax2.legend(loc='lower right')

cursor1 = mplcursors.cursor(lines1, hover=True)
cursor2 = mplcursors.cursor(lines2, hover=True)

fig.tight_layout()
plt.show()

resulting plot

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