每当我使用 matpotlib 将鼠标悬停在每个数据点上时,我想显示特定数据(不是我在绘制散点图时使用的列,而是数据框中的其他列)。我不想使用plotly,因为我需要实现matplotlib的另一部分。 我编写了以下脚本,但当我在 jupyter 笔记本中运行它时,它没有实现悬停部分。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib widget
# Load sample data
diamonds = sns.load_dataset('diamonds')
# Create a scatter plot with hue and use matplotlib to display the specific column values when hovering over a datapoint
sns.scatterplot(x="carat", y="price", hue="cut", data=diamonds)
def hover(event):
# Get the current mouse position
ax = event.inaxes
x, y = event.xdata, event.ydata
# Find the nearest datapoint
distances = ((diamonds['carat'] - x)**2 + (diamonds['price'] - y)**2)
idx = distances.idxmin()
# Display the specific column values in a pop-up window
text = f"Cut: {diamonds.loc[idx, 'cut']}\n" \
f"Clarity: {diamonds.loc[idx, 'clarity']}\n" \
f"Color: {diamonds.loc[idx, 'color']}"
plt.gcf().text(x, y, text, ha='left', va='bottom', fontsize=10, backgroundcolor='white', alpha=0.7)
# Connect the hover function to the figure
fig = plt.gcf()
fig.canvas.mpl_connect("motion_notify_event", hover)
# Show the plot
plt.show()
使用 mplcursors 会更容易。有一个类似的示例,从数据框中提取注释的数据和标签以插入。用你的例子实现的是:
%matplotlib ipympl
# based on https://mplcursors.readthedocs.io/en/stable/examples/dataframe.html
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.patheffects import withSimplePatchShadow
import mplcursors
df = sns.load_dataset('diamonds')[:10]
sbsp = sns.scatterplot(x="carat", y="price", hue="cut", data=df)
def show_hover_panel(get_text_func=None):
cursor = mplcursors.cursor(
hover=2, # Transient
annotation_kwargs=dict(
bbox=dict(
boxstyle="square,pad=0.5",
facecolor="wheat",
edgecolor="#ddd",
linewidth=0.5,
path_effects=[withSimplePatchShadow(offset=(1.5, -1.5))],
),
linespacing=1.5,
arrowprops=None,
),
highlight=True,
highlight_kwargs=dict(linewidth=2),
)
if get_text_func:
cursor.connect(
event="add",
func=lambda sel: sel.annotation.set_text(get_text_func(sel.index)),
)
return cursor
def on_add(index):
item = df.iloc[index]
parts = [
f"Cut: {item.cut}", # f"Cut: {diamonds.loc[idx, 'cut']}\n"
f"Clarity: {item.clarity}", # f"Clarity: {diamonds.loc[idx, 'clarity']}\n"
f"Color: {item.color}", #f"Color: {diamonds.loc[idx, 'color']}"
]
return "\n".join(parts)
sbsp.figure.canvas.header_visible = False # Hide the Figure name at the top of the figure;based on https://matplotlib.org/ipympl/examples/full-example.html
show_hover_panel(on_add)
plt.show();
这是为了在已安装
ipympl
的 JupyterLab 中运行它。
目前要在 Jupyter Notebook 中运行,请将第一行更改为%matplotlib notebook
。
我发现在 JupyterLab 中更流畅。我将在下面指出在两个界面中尝试代码而无需在系统上安装任何内容的方法。
(您的方法可能能够在
这里更多地合并事物。但是,对于mplcursors已经有一个非常相似的答案)
制定的。注意到这里,因为 ipympl 提供的启动存在一些怪癖,我担心如果有什么事情我可能会错过更新每个地方变化。) 在 JupyterLab 中与 ipympl 结合使用,无需接触您的系统
并单击“启动活页夹”徽章。 (如果出现问题,请尝试使用“启动活页夹”徽章,此产品适用于启动已安装 ipympl 的会话。)
%pip install mplcursors seaborn
。运行该安装命令来安装 mplcursors 和 seaborn,然后重新启动内核。
,然后单击页面底部到底部的“启动活页夹”徽章,其左侧显示“Jupyter Notebook 7+”。 (或者只需单击此处开始会话。
%pip install mplcursors seaborn
。运行该安装命令来安装 mplcursors 和 seaborn,然后重新启动内核。