Python 读取 txt 文件指定列并绘图的核心流程是:读取 txt 数据→提取目标列→数据预处理→绘图可视化。本文基于pandas(高效读取 / 处理数据)和matplotlib(绘图核心库),覆盖不同 txt 格式(有无表头、不同分隔符)、不同图表类型(折线图、散点图、柱状图等),并解决中文乱码、数据类型错误等常见问题。
一、前置准备
1. 安装依赖库
执行以下命令安装核心库(pandas处理数据,matplotlib绘图):
bash
pip install pandas matplotlib2. 明确 txt 文件格式(关键)
绘图前需确认 txt 的核心格式,避免读取失败:
| 格式项 | 常见情况 | 处理方式 |
|---|---|---|
| 分隔符 | 空格(多个 / 单个)、制表符(\t)、逗号 | 读取时指定sep参数(如sep="\s+") |
| 表头 | 有(第一行是列名)/ 无(纯数据) | 读取时指定header=0/header=None |
| 编码 | utf-8、gbk(Windows 默认) | 读取时指定encoding参数 |
| 数据类型 | 数字(int/float)、字符串 | 需转换为数值型才能绘图 |
二、核心场景实现
场景 1:基础版 - 无表头 txt,提取 2 列绘散点图 / 折线图
适用于 txt 无表头、数据为纯数值(如实验数据、传感器数据),提取 2 列绘制关联图表。
示例 txt 文件(data.txt):
plaintext
1 23.5 45 2 25.1 48 3 24.8 46 4 26.3 50 5 25.9 49(分隔符:空格;列索引:0 = 序号,1 = 温度,2 = 湿度)
代码实现(提取温度、湿度绘散点图 + 折线图):
python
import pandas as pd import matplotlib.pyplot as plt # 1. 解决matplotlib中文乱码问题(必加,否则中文标签显示方块) plt.rcParams["font.sans-serif"] = ["SimHei"] # 黑体 plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题 # 2. 读取txt文件(无表头,sep="\s+"匹配任意空格) txt_path = r"E:\data.txt" # 替换为你的txt路径 df = pd.read_csv( txt_path, sep="\s+", # 空格分隔(制表符用sep="\t",逗号用sep=",") header=None, # 无表头 encoding="utf-8" # 乱码则改为gbk ) # 3. 提取指定列(列索引从0开始) x_col = df.iloc[:, 1] # 第2列:温度 y_col = df.iloc[:, 2] # 第3列:湿度 x_label = "温度(℃)" y_label = "湿度(%)" # 4. 绘图(散点图+折线图组合) plt.figure(figsize=(8, 5)) # 设置画布大小 # 散点图(标记数据点) plt.scatter(x_col, y_col, color="red", s=50, label="数据点") # 折线图(连接数据点) plt.plot(x_col, y_col, color="blue", linestyle="--", label="趋势线") # 5. 设置图表样式 plt.title("温度-湿度关联图", fontsize=14) # 标题 plt.xlabel(x_label, fontsize=12) # x轴标签 plt.ylabel(y_label, fontsize=12) # y轴标签 plt.grid(True, alpha=0.3) # 网格线(alpha=透明度) plt.legend() # 显示图例 # 6. 保存图片(可选,比直接显示更清晰) plt.savefig(r"E:\temp_humidity.png", dpi=300, bbox_inches="tight") # 显示图表 plt.show()场景 2:进阶版 - 有表头 txt,提取多列绘柱状图 / 对比折线图
适用于 txt 有表头(列名),提取多列做对比分析(如多组实验数据)。
示例 txt 文件(sales.txt):
plaintext
月份,销售额A,销售额B,销售额C 1,12000,15000,10000 2,13500,14800,11000 3,14200,16000,12500 4,13800,15500,11800(分隔符:逗号;表头:月份、销售额 A/B/C)
代码实现(提取月份 + 3 组销售额绘柱状图):
python
import pandas as pd import matplotlib.pyplot as plt # 1. 中文乱码处理 plt.rcParams["font.sans-serif"] = ["SimHei"] plt.rcParams["axes.unicode_minus"] = False # 2. 读取txt(有表头,逗号分隔) txt_path = r"E:\sales.txt" df = pd.read_csv( txt_path, sep=",", # 逗号分隔 header=0, # 第一行是表头 encoding="utf-8" ) # 3. 提取指定列(可通过列名/索引提取) x_col = df["月份"] # 按列名提取:月份 y1_col = df["销售额A"] # 按列名提取:销售额A y2_col = df["销售额B"] # 按列名提取:销售额B y3_col = df["销售额C"] # 按列名提取:销售额C # 4. 绘制多组柱状图 plt.figure(figsize=(10, 6)) bar_width = 0.2 # 柱子宽度 x = range(len(x_col)) # 月份的数值化索引 # 绘制3组柱子(错开位置避免重叠) plt.bar([i - bar_width for i in x], y1_col, width=bar_width, label="销售额A", color="#FF6B6B") plt.bar(x, y2_col, width=bar_width, label="销售额B", color="#4ECDC4") plt.bar([i + bar_width for i in x], y3_col, width=bar_width, label="销售额C", color="#45B7D1") # 5. 样式设置 plt.title("各月份销售额对比", fontsize=14) plt.xlabel("月份", fontsize=12) plt.ylabel("销售额(元)", fontsize=12) plt.xticks(x, x_col) # x轴刻度替换为实际月份 plt.grid(axis="y", alpha=0.3) plt.legend() # 保存+显示 plt.savefig(r"E:\sales_comparison.png", dpi=300, bbox_inches="tight") plt.show()场景 3:实用版 - 处理异常数据后绘图
实际 txt 文件常包含空值、字符串、异常值,需先清洗数据再绘图。
示例 txt 文件(dirty_data.txt):
plaintext
序号,数值1,数值2 1,20.5,30 2,,35 # 空值 3,25.8,abc # 字符串 4,30.2,40 5,999,45 # 异常值(999为无效值)代码实现(清洗数据 + 绘图):
python
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 1. 中文乱码处理 plt.rcParams["font.sans-serif"] = ["SimHei"] plt.rcParams["axes.unicode_minus"] = False # 2. 读取数据 txt_path = r"E:\dirty_data.txt" df = pd.read_csv( txt_path, sep=",", header=0, encoding="utf-8" ) # 3. 数据清洗(关键步骤) # 步骤1:转换数据类型(字符串转数值,无法转换的设为NaN) df["数值1"] = pd.to_numeric(df["数值1"], errors="coerce") df["数值2"] = pd.to_numeric(df["数值2"], errors="coerce") # 步骤2:替换异常值(999改为NaN) df["数值1"] = df["数值1"].replace(999, np.nan) # 步骤3:删除含NaN的行(也可填充:df.fillna(0)) df_clean = df.dropna() # 4. 提取清洗后的列 x_col = df_clean["数值1"] y_col = df_clean["数值2"] # 5. 绘图(折线图) plt.figure(figsize=(8, 5)) plt.plot(x_col, y_col, color="green", marker="o", linewidth=2) plt.title("清洗后的数据趋势图", fontsize=14) plt.xlabel("数值1", fontsize=12) plt.ylabel("数值2", fontsize=12) plt.grid(True, alpha=0.3) plt.savefig(r"E:\clean_data_plot.png", dpi=300) plt.show() # 打印清洗前后的对比 print("清洗前数据:") print(df) print("\n清洗后数据:") print(df_clean)三、常见图表类型扩展
根据提取列的分析需求,选择对应的图表类型:
1. 折线图(趋势分析)
适用于「时间 / 序号 + 数值」列,展示数据变化趋势:
python
plt.plot(x_col, y_col, color="red", marker="s", linestyle="-", linewidth=1.5)2. 柱状图 / 横向柱状图(分类对比)
适用于「分类列 + 多组数值列」,横向柱状图更适合分类名较长的场景:
python
# 横向柱状图 plt.barh(x_col, y_col, color="orange")3. 饼图(占比分析)
适用于「分类列 + 数值列」,展示各分类的占比:
python
plt.pie(y_col, labels=x_col, autopct="%1.1f%%", colors=plt.cm.Set3.colors) plt.axis("equal") # 保证饼图为正圆形4. 箱线图(分布分析)
适用于提取多列数值,分析数据分布、异常值:
python
# 提取多列绘制箱线图 cols = [df.iloc[:, 1], df.iloc[:, 2], df.iloc[:, 3]] plt.boxplot(cols, labels=["列1", "列2", "列3"]) plt.ylabel("数值") plt.title("多列数据分布箱线图")四、常见问题解决
1. 中文标签显示方块(乱码)
- 核心原因:matplotlib 默认无中文字体;
- 解决方案:添加以下代码(开头必加):
python
plt.rcParams["font.sans-serif"] = ["SimHei"] # 黑体(Windows)/ "PingFang SC"(Mac) plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题 - 备选方案:指定字体文件路径(适用于无默认中文字体的环境):
python
from matplotlib.font_manager import FontProperties font = FontProperties(fname=r"C:\Windows\Fonts\simhei.ttf", size=12) plt.title("标题", fontproperties=font)
2. 绘图时报错「ValueError: could not convert string to float」
- 核心原因:提取的列包含字符串,无法作为数值绘图;
- 解决方案:转换数据类型并处理异常:
python
# 转换为数值,无法转换的设为NaN col = pd.to_numeric(df.iloc[:, 1], errors="coerce") # 删除NaN行 col = col.dropna()
3. 列索引越界(IndexError)
- 核心原因:指定的列索引超过 txt 的实际列数;
- 解决方案:先查看数据的列数和结构:
python
print("数据形状(行×列):", df.shape) # 输出如(5,3)表示5行3列 print("前5行数据:") print(df.head())
4. 读取 txt 时乱码
- 解决方案:更换编码格式(utf-8→gbk,或反之):
python
df = pd.read_csv(txt_path, sep="\s+", header=None, encoding="gbk") - 进阶方案:自动检测编码(需安装 chardet):
python
import chardet with open(txt_path, "rb") as f: encoding = chardet.detect(f.read())["encoding"] df = pd.read_csv(txt_path, sep="\s+", header=None, encoding=encoding)
5. 图表保存后缺失标签 / 标题
- 原因:保存时未考虑边界,标签被截断;
- 解决方案:
bbox_inches="tight"参数:python
plt.savefig("plot.png", dpi=300, bbox_inches="tight")
五、总结
| 场景 | 核心步骤 | 推荐图表类型 |
|---|---|---|
| 无表头纯数值 txt,2 列关联分析 | 读取→提取列→散点图 / 折线图 | 散点图、折线图 |
| 有表头 txt,多列对比 | 读取→按列名提取→多组柱状图 | 柱状图、横向柱状图 |
| 含异常值的 txt | 读取→清洗(转类型 / 去空值)→绘图 | 折线图、箱线图 |
| 分类占比分析 | 提取分类列 + 数值列→饼图 | 饼图 |
所有示例代码均可直接复用,只需替换txt_path、列索引 / 列名、图表标签等参数,即可适配不同的 txt 文件和绘图需求。