如何获取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
相关产品推荐
相关产品推荐

