matplotlib 当鼠标悬停在由另外两列组成的折线图上时,如何显示第三个数据框列中的文本?

qmb5sa22  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(101)

因此,我有一个包含3列的 Dataframe :日期、价格、文本
第一个
我想在折线图上绘制日期和价格,但当我将鼠标悬停在折线上时,我希望它显示与该日期对应的行中的文本。
例如,当我将鼠标悬停在与2022-11-27对应的点上时,我希望文本显示“EEE”
我在matplotlib等中尝试了一些东西,但只能从x轴和y轴获取数据来显示,但我不知道如何显示不同列的数据。

djmepvbi

djmepvbi1#

你可以用Plotly

import plotly.graph_objects as go

fig = go.Figure(data=go.Scatter(x=df['dates'], y=df['price'], mode='lines+markers', text=df['text']))
fig.show()
wfveoks0

wfveoks02#

您应该知道,游标和 Dataframe 索引可能会很好地处理散点图上的 * 点 *,但处理线图则有点棘手。
使用线图时,matplotlib会在两个数据点之间绘制直线(基本上,这是线性插值),因此必须考虑特定的逻辑:
1.指定预期行为
1.当光标停留在2个数据点“之间”时,实现相应的鼠标悬停行为。
下面的库/链接可能提供了处理散点图和线图的工具,但我不够专业,无法在SO链接或mplcursors链接中为您指出这一特定部分。
(此外,在你最初的问题中没有清楚地说明确切的预期行为;考虑编辑/澄清)
因此,作为DankyKang's answer的替代方法,请查看以下SO问题和答案,其中涵盖了大量鼠标悬停的可能性:How to add hovering annotations to a plot
值得一提的是这个库:https://mplcursors.readthedocs.io/en/stable/
报价:
mplcursors为Matplotlib提供了交互式数据选择光标。它的灵感来自mpldatacursor,API简化了很多。mplcursors需要Python 3,Matplotlib≥3.1。
具体来说,此示例基于 Dataframe :https://mplcursors.readthedocs.io/en/stable/examples/dataframe.html
报价:
DataFrame可以类似于任何其他类型的输入来使用。在这里,我们使用两列生成散点图,并使用所有列标记点。本示例还将阴影效果应用于悬停面板。
copy-pasta of code example,如果认为此答案不够完整:

from matplotlib import pyplot as plt

from matplotlib.patheffects import withSimplePatchShadow
import mplcursors
from pandas import DataFrame

df = DataFrame(
    dict(
        Suburb=["Ames", "Somerset", "Sawyer"],
        Area=[1023, 2093, 723],
        SalePrice=[507500, 647000, 546999],
    )
)

df.plot.scatter(x="Area", y="SalePrice", s=100)

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="white",
                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"Suburb: {item.Suburb}",
        f"Area: {item.Area:,.0f}m²",
        f"Sale price: ${item.SalePrice:,.0f}",
    ]

    return "\n".join(parts)

show_hover_panel(on_add)

plt.show()

相关问题