使用 matplotlib 进行交互式图形可视化

问题描述 投票:0回答:1

每当我使用 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()

python pandas matplotlib jupyter-notebook interactive
1个回答
1
投票

使用 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已经有一个非常相似的答案)


(运行下面概述的代码的位置和步骤主要是为昨天的 Matplotlib 选项
here

制定的。注意到这里,因为 ipympl 提供的启动存在一些怪癖,我担心如果有什么事情我可能会错过更新每个地方变化。) 在 JupyterLab 中与 ipympl 结合使用,无需接触您的系统

这将允许您在 JupyterLab 中尝试代码,而无需在自己的系统上安装任何内容。

    转到
  • 此处

    并单击“启动活页夹”徽章。 (如果出现问题,请尝试使用“启动活页夹”徽章,此产品适用于启动已安装 ipympl 的会话。)

  • 该会话打开后,在笔记本中运行
  • %pip install mplcursors seaborn

    。运行该安装命令来安装 mplcursors 和 seaborn,然后重新启动内核。

    
    

  • 创建一个新单元格并粘贴上面的代码并运行它。
  • 在当前的 Jupyter Notebook 界面(7+)中尝试一下

转到

此处

,然后单击页面底部到底部的“启动活页夹”徽章,其左侧显示“Jupyter Notebook 7+”。 (或者只需单击此处开始会话

    当该会话打开时,在其中创建一个新单元并运行笔记本
  • %pip install mplcursors seaborn

    。运行该安装命令来安装 mplcursors 和 seaborn,然后重新启动内核。

    
    

  • 创建一个新单元格并粘贴上面的代码并运行它。
  • 无需接触系统即可尝试 Jupyter Notebook 经典界面

这将允许您尝试当前经典 Jupyter Notebook 界面中的代码(很快将更常被称为“以文档为中心的界面”,因为

Jupyter Notebook 7 的底层机制将使用 JupyterLab 组件

)无需在您自己的系统上安装任何东西。

    转到
  • 此处

    并按“启动活页夹”。临时的远程会话将通过 MyBinder 启动。

  • 创建一个新单元格,只需在单元格顶部添加
  • %matplotlib notebook

    即可。然后将上面的代码添加到单元格中,

    保留建议代码的第一行
    ,这样您就可以有效地用 %matplotlib notebook 代替
    %matplotlib ipympl
    
    

  • 运行单元。
© www.soinside.com 2019 - 2024. All rights reserved.