如何在屏幕上以真实分辨率显示 python 图
How to display python plots at real resolution on screen
我可以控制 dpi,并且轴的缩放比例很好,我只需要在我使用的任何数字屏幕上可靠地逐像素显示绘图像素的方法。
事实证明,在数字屏幕上显示它们很棘手。我已经考虑了屏幕的 dpi 并在生成情节时将其考虑在内。我发现显示绘图的最可靠方法是将它们保存为 .png 文件并在 MS 画图中打开它们。我最初使用 matplotlib 的标准绘图查看器取得了成功,但是,由于某些原因我无法解释,即使在考虑 dpi 变化后,它在使用 4k 屏幕时也被证明是不可靠的。我真的很喜欢使用标准查看器,因为它很简单,如果你愿意,你甚至可以探测图像,但不可靠的缩放比例让我无法使用这个选项。我做了一些研究是否有参数可以锁定 window 的缩放功能并将其保持在其原始分辨率但发现 none.
我尝试过其他一些库(例如 PIL)来显示图像,但它使用 OS 图像查看器以最方便的尺寸显示它。
我脑海中浮现的一些想法是:
- pygame。我修改了那个库,它提供了一些很好的像素控制功能。
- 我根本不知道的 matplotlib 内置的替代显示函数。
这是我正在使用的当前脚本。
import matplotlib.pyplot as plt
import numpy as np
#from PIL import Image
#import matplotlib.image as mpimg
def set_size(w,h, ax= None):
"""w, h: width, height in inches"""
if not ax: ax=plt.gca()
l = ax.figure.subplotpars.left
r = ax.figure.subplotpars.right
t = ax.figure.subplotpars.top
b = ax.figure.subplotpars.bottom
print(l,b,r,t)
figw = float(w)/(r-l)
figh = float(h)/(t-b)
ax.figure.set_size_inches(figw, figh)
#Establishing axis limits
xlabel = "Distance (IN)"
xmin=1800
xmax = 3100 #+ 20 * 100
xstep = 100
xscale = np.arange(xmin, xmax + xstep, xstep)
ylabel = "Velcocity (M/S)"
ymin=0
ymax = 1.0 #+.1 *20
ystep = .1
yscale = np.arange(ymin, ymax + ystep, ystep)
#fig, ax=plt.subplots(dpi = 102.4)#For 22in @ 1080p
fig, ax=plt.subplots(dpi = 163)#For 27in @ 4k
#Without removing the margins the scale is off.
#If the margins could be measured and accounted for then there would be
#little they could have a value.
plt.subplots_adjust(.04,.05,.96,.95)
plt.margins(x = 0, y = 0)
#Having issues with the graph scaling
#fig.tight_layout()
ax.set_xticks(xscale)
ax.set_yticks(yscale)
ax.set_xlim(xscale[0], xscale[-1])
ax.set_ylim(yscale[0], yscale[-1])
#ax.plot([0,1,2,3,4,5],[0,1,2,3,4,5])
ax.plot([1900,2100,2400,2700],[.1,.2,.3,.4])
plt.xlabel(xlabel)
plt.ylabel(ylabel)
plt.grid()
set_size(len(xscale)-1, len(yscale)-1)
fig.savefig('plot.pdf')#, bbox_inches = 'tight')
fig.savefig('plot.png')#, bbox_inches = 'tight')
plt.show()
#im = Image.open('axis_ticks_cm.png')
#im.show()
# im = mpimg.imread('axis_ticks_cm.png')
# imgplot = plt.imshow(im)
# plt.show()
我还不知道如何处理图形和轴对象。所以代码可能看起来像是随意组装的——事实确实如此。多次尝试和错误,但我正在弄清楚。
轴缩放参考:
How do you change the size of figures drawn with Matplotlib?
我找到了适合我的解决方案。正如我的问题的评论中提到的,Windows 比例因子在 gui 的大小中起作用,而与 dpi 无关。考虑到这一点,将 dpi 乘以 100/150 以获得 150% 的比例因子可以解决我在 4k 屏幕上遇到的问题。我注意到在 1080p 屏幕上这个比例因子不适用。
标准的 plt.show() 函数似乎可以正常工作,只要屏幕上有足够的空间来呈现情节,否则它会按比例缩小。
我确实找到了一种使用 tkinter 库来锁定分辨率的方法。通过简单地获取图像分辨率,然后将 tkinter gui 设置为该大小。然后将图像设置为背景。 window 当然可以锁定,因此无法缩放或拉伸。即使图像比屏幕大,它也不会缩放 window 适合,这正是我需要的。我在下面包含了我的代码。
import tkinter as tk
from PIL import Image
window = tk.Tk()
window.title("Image Viewer")
backPath = 'plot.png'
img = Image.open(backPath)
w, h = img.size
window.resizable(width = False, height = False)
window.geometry(str(w) + 'x' + str(h))
background_image = tk.PhotoImage(file = backPath)
background_label = tk.Label(window, image=background_image)
background_label.place(x=0, y=0)
window.mainloop()
我可以控制 dpi,并且轴的缩放比例很好,我只需要在我使用的任何数字屏幕上可靠地逐像素显示绘图像素的方法。
事实证明,在数字屏幕上显示它们很棘手。我已经考虑了屏幕的 dpi 并在生成情节时将其考虑在内。我发现显示绘图的最可靠方法是将它们保存为 .png 文件并在 MS 画图中打开它们。我最初使用 matplotlib 的标准绘图查看器取得了成功,但是,由于某些原因我无法解释,即使在考虑 dpi 变化后,它在使用 4k 屏幕时也被证明是不可靠的。我真的很喜欢使用标准查看器,因为它很简单,如果你愿意,你甚至可以探测图像,但不可靠的缩放比例让我无法使用这个选项。我做了一些研究是否有参数可以锁定 window 的缩放功能并将其保持在其原始分辨率但发现 none.
我尝试过其他一些库(例如 PIL)来显示图像,但它使用 OS 图像查看器以最方便的尺寸显示它。
我脑海中浮现的一些想法是:
- pygame。我修改了那个库,它提供了一些很好的像素控制功能。
- 我根本不知道的 matplotlib 内置的替代显示函数。
这是我正在使用的当前脚本。
import matplotlib.pyplot as plt
import numpy as np
#from PIL import Image
#import matplotlib.image as mpimg
def set_size(w,h, ax= None):
"""w, h: width, height in inches"""
if not ax: ax=plt.gca()
l = ax.figure.subplotpars.left
r = ax.figure.subplotpars.right
t = ax.figure.subplotpars.top
b = ax.figure.subplotpars.bottom
print(l,b,r,t)
figw = float(w)/(r-l)
figh = float(h)/(t-b)
ax.figure.set_size_inches(figw, figh)
#Establishing axis limits
xlabel = "Distance (IN)"
xmin=1800
xmax = 3100 #+ 20 * 100
xstep = 100
xscale = np.arange(xmin, xmax + xstep, xstep)
ylabel = "Velcocity (M/S)"
ymin=0
ymax = 1.0 #+.1 *20
ystep = .1
yscale = np.arange(ymin, ymax + ystep, ystep)
#fig, ax=plt.subplots(dpi = 102.4)#For 22in @ 1080p
fig, ax=plt.subplots(dpi = 163)#For 27in @ 4k
#Without removing the margins the scale is off.
#If the margins could be measured and accounted for then there would be
#little they could have a value.
plt.subplots_adjust(.04,.05,.96,.95)
plt.margins(x = 0, y = 0)
#Having issues with the graph scaling
#fig.tight_layout()
ax.set_xticks(xscale)
ax.set_yticks(yscale)
ax.set_xlim(xscale[0], xscale[-1])
ax.set_ylim(yscale[0], yscale[-1])
#ax.plot([0,1,2,3,4,5],[0,1,2,3,4,5])
ax.plot([1900,2100,2400,2700],[.1,.2,.3,.4])
plt.xlabel(xlabel)
plt.ylabel(ylabel)
plt.grid()
set_size(len(xscale)-1, len(yscale)-1)
fig.savefig('plot.pdf')#, bbox_inches = 'tight')
fig.savefig('plot.png')#, bbox_inches = 'tight')
plt.show()
#im = Image.open('axis_ticks_cm.png')
#im.show()
# im = mpimg.imread('axis_ticks_cm.png')
# imgplot = plt.imshow(im)
# plt.show()
我还不知道如何处理图形和轴对象。所以代码可能看起来像是随意组装的——事实确实如此。多次尝试和错误,但我正在弄清楚。
轴缩放参考:
我找到了适合我的解决方案。正如我的问题的评论中提到的,Windows 比例因子在 gui 的大小中起作用,而与 dpi 无关。考虑到这一点,将 dpi 乘以 100/150 以获得 150% 的比例因子可以解决我在 4k 屏幕上遇到的问题。我注意到在 1080p 屏幕上这个比例因子不适用。
标准的 plt.show() 函数似乎可以正常工作,只要屏幕上有足够的空间来呈现情节,否则它会按比例缩小。
我确实找到了一种使用 tkinter 库来锁定分辨率的方法。通过简单地获取图像分辨率,然后将 tkinter gui 设置为该大小。然后将图像设置为背景。 window 当然可以锁定,因此无法缩放或拉伸。即使图像比屏幕大,它也不会缩放 window 适合,这正是我需要的。我在下面包含了我的代码。
import tkinter as tk
from PIL import Image
window = tk.Tk()
window.title("Image Viewer")
backPath = 'plot.png'
img = Image.open(backPath)
w, h = img.size
window.resizable(width = False, height = False)
window.geometry(str(w) + 'x' + str(h))
background_image = tk.PhotoImage(file = backPath)
background_label = tk.Label(window, image=background_image)
background_label.place(x=0, y=0)
window.mainloop()