Python绘图保存为具有精确128x250像素的png?

Posted

技术标签:

【中文标题】Python绘图保存为具有精确128x250像素的png?【英文标题】:Python plot save as png with exact 128x250 pixel? 【发布时间】:2022-01-20 16:30:33 【问题描述】:

对于 eink 显示器,它需要使用恰好 128x250 像素的 png 文件。

从一个小的温度和湿度记录器中,我得到如下结果:

Date,Time,Temperature,Humidity
12.12.2021,17:02,23.8,48.9
12.12.2021,17:03,22.8,45.1
12.12.2021,17:04,22.7,44.5
12.12.2021,17:05,22.6,44.6
12.12.2021,17:06,22.6,45.4
12.12.2021,17:07,22.5,45.1
13.12.2021,13:02,23.8,48.9
13.12.2021,13:03,22.8,45.1
13.12.2021,13:04,22.7,44.5
13.12.2021,13:05,22.6,44.6
13.12.2021,13:06,22.6,45.4
13.12.2021,13:07,22.5,45.1
14.12.2021,19:02,23.8,48.9
14.12.2021,19:03,22.8,45.1
14.12.2021,19:04,22.7,44.5
14.12.2021,19:05,22.6,44.6
14.12.2021,19:06,22.6,45.4
14.12.2021,19:07,22.5,45.1

我使用 python 做了一些简单的绘图,比如(我是 python 中的一个小人物):

from pandas import read_csv as pd
from matplotlib import pyplot as plt

Raspilog = pd('Temp.csv', header=0, squeeze=True)
Raspilog_CDate = Raspilog[Raspilog.Date == "13.12.2021"]


fig, ax = plt.subplots()
ax.plot(Raspilog_CDate.Time, Raspilog_CDate.Temperature, color="red")
ax2 = ax.twinx()
ax2.set(ylim=(0, 100))
ax2.plot(Raspilog_CDate.Time, Raspilog_CDate.Humidity, color="black")

plt.show()

结果如下:

但我需要它是 128x250 像素并保存为 png

我已经在互联网上阅读了有关 DPI 和英寸等的信息。在我看来,没有简单的解决方案:(有谁知道如何做到这一点?

【问题讨论】:

这并不难。 pyplot 的默认 DPI 是 100,所以 plt.figure(figsize=(2.5, 1.28) ) 应该做你想做的事。 【参考方案1】:

您需要稍微调整一下 dpi(“每英寸点数”:每英寸的像素数)和 figsize(以英寸为单位)。 figsize 需要足够大以使文本 fig 有点合理。请注意,250x128 非常小,因此阅读文本会很困难。

以下代码是对一些可能的 dpi 进行试验的结果。 50 dpi 似乎还不错。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from io import StringIO

df_str = '''Date,Time,Temperature,Humidity
12.12.2021,17:02,23.8,48.9
12.12.2021,17:03,22.8,45.1
12.12.2021,17:04,22.7,44.5
12.12.2021,17:05,22.6,44.6
12.12.2021,17:06,22.6,45.4
12.12.2021,17:07,22.5,45.1
13.12.2021,13:02,23.8,48.9
13.12.2021,13:03,22.8,45.1
13.12.2021,13:04,22.7,44.5
13.12.2021,13:05,22.6,44.6
13.12.2021,13:06,22.6,45.4
13.12.2021,13:07,22.5,45.1
14.12.2021,19:02,23.8,48.9
14.12.2021,19:03,22.8,45.1
14.12.2021,19:04,22.7,44.5
14.12.2021,19:05,22.6,44.6
14.12.2021,19:06,22.6,45.4
14.12.2021,19:07,22.5,45.1'''
df = pd.read_csv(StringIO(df_str))

png_width, png_height = 250, 128
png_dpi = 50
fig, ax = plt.subplots(figsize=(png_width / png_dpi, png_height / png_dpi))
ax.plot(df.Time, df.Temperature, color="red")
ax2 = ax.twinx()
ax2.plot(df.Time, df.Humidity, color="black")
ax2.set_ylim(0, 100)

ax.set_xticks(np.arange(0, len(df), 2))
ax.set_xticks(np.arange(0, len(df)), minor=True)
ax.set_xticklabels(df.Time[0::2])
ax.tick_params(axis='x', which='both', length=4)
plt.tight_layout()
fig.savefig('Test250x128.png', dpi=png_dpi)

plt.show()

这会生成一个正好为 250x128 的 png:

【讨论】:

嗨,约翰,感谢您的精彩回复。看起来 50 的 DPI 会以某种方式生成每个轴上的像素数翻倍的图像。将“png_dpi”更改为 100 会产生 250x128。非常感谢您的帮助 你用过figsize=(png_width / png_dpi, png_height / png_dpi)吗?我们的想法是使用默认字体大小找到一个数字看起来有点像样的 figsize。 更改标签大小的问题是,当您还有标题和轴标签以及其他文本时,它会变得复杂。因此,我的代码背后的想法是使用默认标签大小并快速检查屏幕上的绘图。 您可以将日期加时间转换为 pandas 日期时间格式。并使用类似Python plot with 24 hrs x and y axis using only hours and minutes from timestamp 你需要像ax.set_xlim(pd.to_datetime('20211212 00:00'), pd.to_datetime('20211213 00:00'))这样的东西

以上是关于Python绘图保存为具有精确128x250像素的png?的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 中像素精确的 UIImage 重采样

如何保存来自 python 循环的不同名称的多个绘图? [复制]

OpenGL 中的 2D 绘图:在原始尺寸下具有像素精度的线性过滤

使用 C/C++ 和 WinApi 精确绘制 1 像素宽度的线

Python绘图工具turtle库的使用

Python:GUI - 绘图,从实时GUI中读取像素