Python绘制带两种线型的DataFrame多折线图:求更高效实现方法
更高效的多折线图实现方案(按X_Y字段区分样式)
原代码的核心问题在于循环内重复执行切片、列删除和转置操作,当数据量较大时会产生不必要的性能损耗。下面提供两种更高效的实现方式:
方法一:先重塑数据结构,批量绘图
先把数据整理成适合直接绘图的格式,避免循环内重复处理数据:
import pandas as pd import matplotlib.pyplot as plt # 假设df已存在,这里用示例数据 df = pd.DataFrame( { "Point": ("1", "1", "2", "2", "3", "3", "4", "4", "5", "5"), "X_Y": ("X", "Y", "X", "Y", "X", "Y", "X", "Y", "X", "Y"), 0: (70, 67, 66.7, 68.8, 66.2, 69.5, 68.5, 67.7, 68.8, 67.72), 1: (69, 68.2, 66.5, 68.1, 66.7, 70, 68.1, 66.7, 66.08, 65.72), 2: (71, 68, 67.75, 67.8, 67.72, 70.3, 67.6, 66.5, 69.08, 66.72), 3: (70.5, 67.3, 67.5, 64.8, 68.3, 69.3, 68.6, 68.5, 70.08, 67.72), } ) # 一次性完成索引设置与转置,避免循环内重复操作 df_transposed = df.set_index(["Point", "X_Y"]).T plt.figure() plt.grid(True) # 按X_Y分组后直接绘图,指定对应样式 for xy, group in df_transposed.groupby("X_Y", axis=1): linestyle = "--" if xy == "Y" else "-" plt.plot(group, linestyle=linestyle) plt.show()
这个方法只做一次转置和分组操作,避免了循环内重复的切片、列删除步骤,数据量越大,性能提升越明显。
方法二:用pandas内置plot方法+样式映射
利用pandas的plot功能结合样式字典,代码更简洁,且pandas内部做了性能优化,执行效率更高:
import pandas as pd import matplotlib.pyplot as plt # 假设df已存在 df = pd.DataFrame( { "Point": ("1", "1", "2", "2", "3", "3", "4", "4", "5", "5"), "X_Y": ("X", "Y", "X", "Y", "X", "Y", "X", "Y", "X", "Y"), 0: (70, 67, 66.7, 68.8, 66.2, 69.5, 68.5, 67.7, 68.8, 67.72), 1: (69, 68.2, 66.5, 68.1, 66.7, 70, 68.1, 66.7, 66.08, 65.72), 2: (71, 68, 67.75, 67.8, 67.72, 70.3, 67.6, 66.5, 69.08, 66.72), 3: (70.5, 67.3, 67.5, 64.8, 68.3, 69.3, 68.6, 68.5, 70.08, 67.72), } ) # 整理绘图数据 df_plot = df.set_index(["Point", "X_Y"]).T # 定义X_Y对应的样式映射 style_map = {"X": "-", "Y": "--"} # 批量提取分组数据并绘图 plt.figure() plt.grid(True) for xy in style_map: df_plot.xs(xy, level="X_Y", axis=1).plot(linestyle=style_map[xy], ax=plt.gca()) plt.show()
这个方法利用pandas的xs方法快速提取指定分组的数据,配合内置plot功能,代码更简洁,执行效率也优于原代码的循环处理方式。
两者的核心优化点都是减少循环内的数据重复处理,只做一次数据结构转换,后续直接基于整理好的数据绘图,在大数据量场景下性能提升显著。
内容的提问来源于stack exchange,提问作者Bakira
相关产品推荐
相关产品推荐

