【问题标题】:matplotlib notebook cursor coordinates on graph with double y axismatplotlib 笔记本光标坐标图上的双 y 轴
【发布时间】:2020-06-22 10:35:09
【问题描述】:

我想让你弄清楚的问题是关于 matplotlib 图上带有双 y 轴的坐标出现。首先是 Jupyter Notebook 上的代码,它用两条线和一个 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()

本图在图的右下角提供了两条带有光标坐标的线。

以下代码

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

显示如下图

它显示了一个带有两个 y 刻度的图表,左侧一个红色,右侧一个蓝色。这里的问题是,在图片的左下角有与右侧比例相关的光标坐标,而与左侧无关。有没有办法同时显示这两个比例?

【问题讨论】:

  • 希望答案是有帮助的。彻底回答问题很费时间。如果您的问题已解决,请接受解决方案 位于答案左上角的 ▲/▼ 箭头下方。如果出现更好的解决方案,则可以接受新的解决方案。如果您的声望超过 15,您还可以使用 ▲/▼ 箭头对答案的有用性进行投票。 如果解决方案不能回答问题,请发表评论。 What should I do when someone answers my question?。谢谢。

标签: python-3.x matplotlib mplcursors


【解决方案1】:

根据您的具体需求,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()

【讨论】:

  • mplcursors 还可以将两种比例显示在一个注释中,如果这样更适合用例的话
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多