如何用SymPy绘制Pandas DataFrame?新手技术求助
解决SymPy绘制DataFrame文本数据点并连接坐标轴的问题
你的核心问题是直接用字符串(如"Lionel Messi"、"Argentina")作为坐标值,SymPy的绘图系统无法处理非数值坐标。需要先将文本标签映射为数值位置,再绘制点和连线,同时替换坐标轴刻度为文本标签。
以下是修正后的代码:
from sympy.plotting import plot import pandas as pd from sympy import symbols # 定义符号和函数 x = symbols("x") ekpr = x # 创建DataFrame data = { "name": ["Lionel Messi", "Cristiano Ronaldo"], "country": ["Argentina", "Portugal"] } df = pd.DataFrame(data, columns=["name", "country"]) # 建立文本到数值的映射(自定义位置,可根据需求调整) name_to_x = {name: idx+1 for idx, name in enumerate(df["name"].unique())} country_to_y = {country: idx+1 for idx, country in enumerate(df["country"].unique())} # 获取目标数据点的数值坐标 target_name = df.loc[0, "name"] target_country = df.loc[0, "country"] point_x = name_to_x[target_name] point_y = country_to_y[target_country] # 准备标记和连线:点 + 到x轴、y轴的虚线 markers = [] # 绘制数据点 markers.append({'args': [[point_x], [point_y], 'ro']}) # 绘制到x轴的连线(从点到(x, 0)) markers.append({'args': [[point_x, point_x], [point_y, 0], 'r--']}) # 绘制到y轴的连线(从点到(0, y)) markers.append({'args': [[point_x, 0], [point_y, point_y], 'r--']}) # 绘制图像,设置坐标轴范围和刻度 p = plot(ekpr, xlim=[0, len(name_to_x)+1], ylim=[0, len(country_to_y)+1], markers=markers, show=False) # 替换x轴刻度为名字 p.xaxis.set_ticks(list(name_to_x.values())) p.xaxis.set_ticklabels(list(name_to_x.keys())) # 替换y轴刻度为国家 p.yaxis.set_ticks(list(country_to_y.values())) p.yaxis.set_ticklabels(list(country_to_y.keys())) p.show()
关键说明:
- 文本-数值映射:用字典将每个唯一的名字/国家映射到一个数值位置,让SymPy可以识别坐标。
- 连线构造:分别绘制从数据点到
(point_x, 0)(x轴)和(0, point_y)(y轴)的虚线,确保连线正确连接坐标轴。 - 刻度替换:将坐标轴的数值刻度替换为对应的文本标签,让图表更直观。
内容的提问来源于stack exchange,提问作者Fahrizal
相关产品推荐
相关产品推荐

