先問兩個問題,你思考過:
為什么matplotlib繪圖,有一個“figure'圖形對象,還需要“canvas'畫布對象?又不是真的在畫布上繪畫?
mpl中是如何實現(xiàn)坐標定位的?
在photoshop中也是如此。
在學習計算機繪圖時,經(jīng)常見到一些概念,如:
DPI
PPI
圖像
畫布
圖像尺寸
畫布尺寸
分辯率
inches
像素(pixels)
Axes
Axis
.......等
像我這樣的草根,初期常擰不清它們,并且困惑于:為什么要弄出這么多“差不多”(相似)的概念?
我也很長時間停留在對它們的一知半解上,因為那時也認為,大致知道這此概念就“差不多了”(馬馬虎虎),我只要能畫出圖形來即可!
其實理清這些概念很重要,它是輸出圖像質量、繪圖坐標設置、matplotlib一些參數(shù)設置等的基礎,甚至有時直接決定了你自由操控matplotlib的能力(如坐標變換)。在對它們模糊的時候,使用matplotlib,很多參數(shù)設置的目的和產(chǎn)生的結果也就是模糊的。
等我花一些時間理清楚它們后,過去對matplotlib中一些不能理解的地方也豁然開朗了。
本打算把類似上面的一些基礎性概念在一篇文章中做個總結,因篇幅的限制,需要分幾篇了。
繪圖過程中,絕大多數(shù)時間,我們都是在顯示器(本文以液晶顯示器為例)上操作、查看圖像。
顯示器有一個最直接、固定的參數(shù),就是經(jīng)常說的屏幕尺寸。
屏幕尺寸(物理尺寸),用英寸 inches表示,它是矩形'液晶面板'的對角線長度。比如,17寸顯示器,23.1寸顯示器...等。
矩形的對角線是23.1 inches,顯示器的長、寬是多少呢?這就引入了屏幕比例的概念,如標準的4:3,16:9。
1 英寸 = 2.54 厘米。
我正在用的臺式機上的顯示器是:23.1英寸,16:9。
用 l 、w 分別表示液晶面板的長和寬,有:
解上面的方程組即可大概地計算出顯示器屏幕的長和寬了,單位是厘米。
計算結果是:
l = 51.55556 ≈ 51 厘米
w = 28.76559 ≈ 29 厘米
我們可以用尺子量一下屏幕顯示區(qū)的長和寬。更精確的是使用硬件檢測軟件獲取顯示器的詳細信息,我的顯示器檢測結果如下:
小結:
用液晶面板的對角線長度,單位英寸,inches,表示 ;
屏幕的長寬比叫屏幕比例,如 16:9;
上兩點計算出屏幕的物理長、寬,一般用厘米或英寸表示。
在matplotlib中,`display`坐標就是基于這個屏幕構建的坐標,所以用inches或像素標識。
后面會專題討論matplotlib中的各種坐標系,上面的知識會有助于你的理解。
液晶是一種特殊的有機化合物, 在常溫條件下,它呈現(xiàn)出既有液體的流動性,又有晶體的光學各向異性,因而稱為“液晶”。
液晶的物理特性是:當通電時,排列變的有秩序,使光線容易通過(看起來就是亮);不通電時排列混亂,阻止光線通過(看起來就是灰暗)。讓液晶如閘門般地阻隔或讓光線穿透。
液晶層中的液滴都被包含在細小的單元格結構中,一個或多個單元格構成屏幕上的一個像素。在玻璃板與液晶材料之間是透明的電極,電極分為行和列,在行與列的交叉點上,通過改變電壓而改變液晶的旋光狀態(tài),液晶材料的作用類似于一個個小光閥。這樣就可以控制每個像素的亮度和顏色了。
顯然,相同尺寸的液晶層上劃分的單元格(像素)越多,顯示器的顯示精度就越高,顯示出來的圖像就越細膩,但這種顯示器的制作工藝難度就會增加,成本也會增加。
顯示器就是通過在一個一個單元格(像素)中填充不同的顏色來表達圖像的。
像素就是最小的顯示單元格,在一個單元格中只能顯示相同的顏色。
我們在選購顯示器時,非常關注的”分辨率“參數(shù),它就與”像素“有關。像素常用字母PX表示。
分辨率,又稱解析度、解像度。即顯示屏幕區(qū)域被分解為多少個像素(單元格)。
雖然在系統(tǒng)中有設置顯示器分辨的地方,但液晶顯示器的最大分辨率在出廠后就是固定的了。能設置的僅是當前分辨率。下圖是windows 10 系統(tǒng)設置顯示分辨率的界面。
我的顯示器最大分辨率是 1920*1080,即長向上有1920個PX,寬向上有1080PX
總的有 2073600 個像素,它就是我的顯示的分辨率了。這個數(shù)字太大,不好理解,所以一般直接用類似 1920PX * 1080PX這樣的形式來表示屏幕的分辨率,手機屏幕也是如此。
題外話:液晶面板的單元格劃分在出廠時就固定了,為什么還能設置當前分辨率呢?
假如我將當前分辨率調整為1280px*960px,按照定義,長向就是1280個像素,寬向就是960個像素。其實并不是你改變了顯示器分辨率,而是操作系統(tǒng)欺騙了你。操作系統(tǒng)通過一系列運算將1920*1080個單元格矩陣變換為1280*960個模擬像素矩陣呈現(xiàn)給你。所以,就有了當前分辨率和最大分辨。
基于分辨率的含義,人們還用每英寸長度上像素個數(shù)來表示屏幕分辨率,即 Pixels per inches,縮寫為 PPI。
我的顯示器長向上最大為1920像素,物理長度是51厘米(折合20.078英寸),每英寸長度上有1920 px / 20.078 inches ≈ 96 PPI。
所以,有時又說我的顯示器分辨率是 96 PPI。
也有人把他說成 96 DPI,這是不嚴格的。對于顯示器分辨率,嚴格來說應該用 96 PPI。當然你很清楚它們的含義時,反而混用也沒有關系了。
DPI 是 Dots per inches的縮寫。DPI是一個與打印機、印刷緊密相關的概念。
打印機是通過一個一個的墨點來打印圖像的,每個墨點的色彩只能是一樣的,打印機在每英寸上可打印的點數(shù)就是DPI。顯然DPI越大,打印出來的圖像就越細膩。所以,常用DPI作為打印機的分辨率來表示打印機的最大可打印質量。
為什么說是最大可打印質量呢?即這臺打印機最大打印分辨率,但實際打印分辨率還與圖像的分辨率有關。
一般打印機的分辨在150-300DPI,高的能達到600DPI。
我們用100%的比例打印圖像:
假如有一臺打印機的分辨率是600DPI,要打印一幅分辨率(后面會討論圖像分辨率)為300DPI的圖像,打印機是不可能改變圖像分辨率的,打印到紙上的照片的分辨率就是300DPI,因為圖像的原始點是這么大,即使打印機用了兩個點表達圖像中的一個點,但這兩個點是一樣的色彩。
反過來,用一臺300DPI的打印機,打印一幅600DPI的圖像,打印出來的照片也只能是300DPI的。因為打印機無法表達更小的點。
嚴格來說:
像素就是顯示器、圖像被分割成的最小格子;
單個格子越小,每英寸上格子就越多,即像素越大,顯示就越細膩;
單個格子越大,每英寸上格子就越少,即像素越小,顯示就越粗糙;
顯示分辨率用PPI,Pixels Per Inches;
打印分辨率用DPI,Dots Per Inches。
它們對matplotlib來說很重要。
聯(lián)系客服