如何用Matplotlib或图像处理方法绘制低分辨率曲线?
问题
需要重新绘制低分辨率风格的曲线(参考示例图),但当前使用Matplotlib绘制的曲线平滑度过高,询问是否可通过Matplotlib直接调整或图像处理方案实现目标,且最终仅保留低分辨率数据曲线。
提供的绘图代码:
import csv import matplotlib.pyplot as plt arr = [] with open('points.csv') as csv_file: csv_reader = csv.reader(csv_file, delimiter=',') for row in csv_reader: x = float(row[0]) y = float(row[1]) arr.append([x, y]) data = list(arr) plt.plot(*zip(*data), color='black', linewidth=0.5, alpha=1.0) plt.savefig("report.png")
数据示例:
617,21.550045745097 617.25,21.4286797104602 617.5,21.3023081618079 617.75,21.1830623411815 618,21.0748879703542
解决方案
可以通过两种方式实现低分辨率曲线效果:
方法一:Matplotlib直接调整绘图参数
Matplotlib默认会对线条做抗锯齿处理导致曲线平滑,修改以下参数即可得到低分辨率风格:
- 关闭抗锯齿:在
plot函数中添加antialiased=False,让线条呈现原生锯齿边缘plt.plot(*zip(*data), color='black', linewidth=0.5, alpha=1.0, antialiased=False) - 降低保存DPI:设置
savefig的dpi为低值,直接生成低分辨率图像,放大后会呈现像素块效果plt.savefig("report.png", dpi=30) - 阶梯状绘制:用
drawstyle='steps'让曲线在相邻点之间以水平/垂直线段连接,更贴近像素化风格plt.plot(*zip(*data), color='black', linewidth=0.5, alpha=1.0, drawstyle='steps', antialiased=False)
方法二:图像处理后处理
先按原有代码生成平滑曲线,再通过图像工具转换为低分辨率风格:
以Python的PIL库为例:
from PIL import Image # 读取原平滑曲线图片 img = Image.open("report.png") # 先缩小到低分辨率尺寸,再用最近邻插值放大回原尺寸实现像素化 low_res_size = (img.width // 10, img.height // 10) low_res_img = img.resize(low_res_size, Image.NEAREST).resize(img.size, Image.NEAREST) # 保存低分辨率图片 low_res_img.save("low_res_report.png")
内容的提问来源于stack exchange,提问作者xPain
相关产品推荐
相关产品推荐

