You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Matplotlib中标记点的精确坐标?

如何查看Matplotlib图表标记点的精确坐标

问题描述

我正在做数据库与图表相关的工作,需要精确查看Matplotlib绘制的图表中标记点的坐标,但还没找到合适的方法。以下是我的测试代码(数据库相关代码已注释,用手动数据替代):

import matplotlib.pyplot as plt
import sqlite3
from datetime import datetime

fechas = []
fechas_string = ['01/01/2024','02/01/2024','07/01/2024']
result_1=[2,4,1]

def convertTuple(tup):
    str = ''.join(tup) #Funcion encargada de convertir las tuplas en strings
    return str

def conexion_Db():
    try:
        #sqliteConnection = sqlite3.connect('webscrap.db') #Conexion a base de datos
        #cursor = sqliteConnection.cursor() #Defino un cursor que me permite interactuar con la BD
        print('Base Iniciada')
        #query_1 = '''SELECT asd FROM Products''' #Defino una consulta para poder reutilizarla en algun momento
        #query_2 = '''SELECT otro_numero FROM Products''' #Igual que la consulta anterior
        #cursor.execute(query_1) #.execute ejecuta la consulta
        #result_1 = cursor.fetchall() #Guarda la informacion que tiene cursor en este caso en result_1
        #cursor.execute(query_2)
        #result_2 = cursor.fetchall()
        #fechas_string="" #Lo uso despues como variable temporal
        #fechas=[] #Aca se guardan las fechas en formato fecha dd/mm/yy
        #for x in result_2:                                              #En este for convierto las tuplas dentro de las listas en strings. Es necesario porque vienen en formato tupla y aparentemente el grafico no es capaz de interpretarlas
            #fechas_string=convertTuple(x)                               #Ademas cambio los strings a formato fecha y despues las agrego a la lista con .append
            #fechas.append(datetime.strptime(fechas_string, '%d/%m/%Y')) 
        for x in fechas_string:
            fechas.append(datetime.strptime(x, '%d/%m/%Y')) 
        
        plt.plot(fechas, result_1, color="red", linestyle="dashed", linewidth= 3, marker=".", markerfacecolor="green", markersize=10) #Customizacion del grafico
        plt.xlabel('Eje X') #Mas customizaciones
        plt.ylabel('Eje Y')
        plt.title('Primer Grafico')
        plt.show() #Para mostrar el grafico

    except sqlite3.Error as error:
        print('Error occurred - ', error)

    finally:
        #if sqliteConnection:
            #sqliteConnection.close()
            print('SQl Connection closed')
conexion_Db()

实用解决方案

1. 用Matplotlib自带工具栏查看

打开图表后:

  • 点击工具栏的**十字准线(Pan/Zoom)**按钮,鼠标悬停在标记点上,窗口右下角会显示精确的坐标值(X轴会显示对应的datetime格式日期);
  • 要是坐标显示太挤,可点击**放大镜(Zoom to rectangle)**放大局部区域,方便查看细节。

2. 自动给所有标记点标注坐标

在调用plt.show()之前,添加一段代码循环遍历数据点,用plt.text()把坐标直接标在图表上:

# 遍历每个数据点,添加坐标标注
for x, y in zip(fechas, result_1):
    # ha和va控制文本对齐方式,避免遮挡标记点
    plt.text(x, y, f'({x.strftime("%d/%m/%Y")}, {y})',
             fontsize=8, ha='right', va='bottom')

3. 直接打印所有坐标数据

如果需要批量查看,在代码中直接输出数据即可,不用依赖图表:

# 打印每个点的坐标
for fecha, valor in zip(fechas, result_1):
    print(f"标记点:日期={fecha.strftime('%d/%m/%Y')},数值={valor}")

4. 用mplcursors实现交互式点击标注

安装mplcursors库(执行pip install mplcursors),添加一行代码就能实现点击标记点显示坐标的功能:

import mplcursors

# 绘制图表后添加
mplcursors.cursor().connect(
    "add", lambda sel: sel.annotation.set_text(
        f'{sel.target[0].strftime("%d/%m/%Y")}, {sel.target[1]}'
    )
)

额外优化建议

  • 处理数据库返回的元组数据时,原代码的convertTuple函数可以简化:result_1 = [item[0] for item in cursor.fetchall()],直接提取元组里的数值,不用转字符串;
  • 日期轴标签如果显示拥挤,添加plt.xticks(rotation=45)让标签旋转45度,提升可读性;
  • 可以把数据库连接和数据查询逻辑封装成单独的函数,让代码结构更清晰。

内容的提问来源于stack exchange,提问作者Leandro Zárate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 19:33:26