34.35.热图(heatmap)、创建带注释的热图、使用辅助函数的代码样式、图像显示、图像插值、将图像数据导入Numpy数组、将numpy数组绘制为图像
34.熱圖(heatmap)
34.1.創建帶注釋的熱圖
34.2.使用輔助函數的代碼樣式
35.圖像顯示
35.1.圖像插值
35.2.將圖像數據導入Numpy數組
35.3.將numpy數組繪制為圖像
34.熱圖(heatmap)
34.1.創建帶注釋的熱圖
將依賴于兩個自變量的數據顯示為彩色圖像圖,通常稱為熱圖。如果數據是分類的,則將其稱為分類熱圖。 Matplotlib的imshow函數使這種繪圖的制作特別容易。
以下示例顯示了如何創建帶有注釋的熱圖。我們將從一個簡單的分類熱圖開始。
我們可以從定義一些數據開始。我們需要一個2D列表或數組,用于將數據定義為顏色代碼。然后,我們還需要兩個列表或類別數組;當然,這些列表中的元素數量需要與各個軸上的數據匹配。
熱圖本身是一個imshow圖,其標簽設置為擁有的類別。請注意,必須同時設置刻度位置(set_xticks)和刻度標簽(set_xticklabels),否則它們將變得不同步。位置只是升序的整數,而ticklabels是要顯示的標簽。最后,可以通過在每個單元格中創建一個顯示該單元格值的文本來標記數據本身。
import numpy as np import matplotlib import matplotlib.pyplot as pltvegetables = ["cucumber", "tomato", "lettuce", "asparagus","potato", "wheat", "barley"] farmers = ["Farmer Joe", "Upland Bros.", "Smith Gardening","Agrifun", "Organiculture", "BioGoods Ltd.", "Cornylee Corp."]harvest = np.array([[0.8, 2.4, 2.5, 3.9, 0.0, 4.0, 0.0],[2.4, 0.0, 4.0, 1.0, 2.7, 0.0, 0.0],[1.1, 2.4, 0.8, 4.3, 1.9, 4.4, 0.0],[0.6, 0.0, 0.3, 0.0, 3.1, 0.0, 0.0],[0.7, 1.7, 0.6, 2.6, 2.2, 6.2, 0.0],[1.3, 1.2, 0.0, 0.0, 0.0, 3.2, 5.1],[0.1, 2.0, 0.0, 1.4, 0.0, 1.9, 6.3]])plt.figure(figsize=(16,16)) fig, ax = plt.subplots() im = ax.imshow(harvest)# We want to show all ticks... ax.set_xticks(np.arange(len(farmers))) ax.set_yticks(np.arange(len(vegetables))) # ... and label them with the respective list entries ax.set_xticklabels(farmers) ax.set_yticklabels(vegetables)# Rotate the tick labels and set their alignment. plt.setp(ax.get_xticklabels(), rotation=45, ha="right",rotation_mode="anchor")# Loop over data dimensions and create text annotations. for i in range(len(vegetables)):for j in range(len(farmers)):text = ax.text(j, i, harvest[i, j],ha="center", va="center", color="w")ax.set_title("Harvest of local farmers (in tons/year)") #fig.tight_layout() plt.show()34.2.使用輔助函數的代碼樣式
人們可能想重用這種代碼來為不同的輸入數據和/或在不同的軸上創建某種熱圖。 我們創建一個函數,該函數將數據以及行和列標簽作為輸入,并允許使用用于自定義繪圖的參數
在這里,除了上面的內容外,我們還希望創建一個顏色欄,并將標簽放置在熱圖上方而不是其下方。 注釋將根據閾值獲得不同的顏色,以更好地與像素顏色形成對比。 最后,我們將周圍的軸旋轉并創建白線網格以分隔單元格。
import numpy as np import matplotlib import matplotlib.pyplot as pltdef heatmap(data, row_labels, col_labels, ax=None,cbar_kw={}, cbarlabel="", **kwargs):"""Create a heatmap from a numpy array and two lists of labels.Parameters----------dataA 2D numpy array of shape (N, M).row_labelsA list or array of length N with the labels for the rows.col_labelsA list or array of length M with the labels for the columns.axA `matplotlib.axes.Axes` instance to which the heatmap is plotted. Ifnot provided, use current axes or create a new one. Optional.cbar_kwA dictionary with arguments to `matplotlib.Figure.colorbar`. Optional.cbarlabelThe label for the colorbar. Optional.**kwargsAll other arguments are forwarded to `imshow`."""if not ax:ax = plt.gca()# Plot the heatmapim = ax.imshow(data, **kwargs)# Create colorbarcbar = ax.figure.colorbar(im, ax=ax, **cbar_kw)cbar.ax.set_ylabel(cbarlabel, rotation=-90, va="bottom")# We want to show all ticks...ax.set_xticks(np.arange(data.shape[1]))ax.set_yticks(np.arange(data.shape[0]))# ... and label them with the respective list entries.ax.set_xticklabels(col_labels)ax.set_yticklabels(row_labels)# Let the horizontal axes labeling appear on top.ax.tick_params(top=True, bottom=False,labeltop=True, labelbottom=False)# Rotate the tick labels and set their alignment.plt.setp(ax.get_xticklabels(), rotation=-30, ha="right",rotation_mode="anchor")# Turn spines off and create white grid.for edge, spine in ax.spines.items():spine.set_visible(False)ax.set_xticks(np.arange(data.shape[1] + 1) - .5, minor=True)ax.set_yticks(np.arange(data.shape[0] + 1) - .5, minor=True)ax.grid(which="minor", color="w", linestyle='-', linewidth=3)ax.tick_params(which="minor", bottom=False, left=False)return im, cbardef annotate_heatmap(im, data=None, valfmt="{x:.2f}",textcolors=["black", "white"],threshold=None, **textkw):"""A function to annotate a heatmap.Parameters----------imThe AxesImage to be labeled.dataData used to annotate. If None, the image's data is used. Optional.valfmtThe format of the annotations inside the heatmap. This should eitheruse the string format method, e.g. "$ {x:.2f}", or be a`matplotlib.ticker.Formatter`. Optional.textcolorsA list or array of two color specifications. The first is used forvalues below a threshold, the second for those above. Optional.thresholdValue in data units according to which the colors from textcolors areapplied. If None (the default) uses the middle of the colormap asseparation. Optional.**kwargsAll other arguments are forwarded to each call to `text` used to createthe text labels."""if not isinstance(data, (list, np.ndarray)):data = im.get_array()# Normalize the threshold to the images color range.if threshold is not None:threshold = im.norm(threshold)else:threshold = im.norm(data.max()) / 2.# Set default alignment to center, but allow it to be# overwritten by textkw.kw = dict(horizontalalignment="center",verticalalignment="center")kw.update(textkw)# Get the formatter in case a string is suppliedif isinstance(valfmt, str):valfmt = matplotlib.ticker.StrMethodFormatter(valfmt)# Loop over the data and create a `Text` for each "pixel".# Change the text's color depending on the data.texts = []for i in range(data.shape[0]):for j in range(data.shape[1]):kw.update(color=textcolors[int(im.norm(data[i, j]) > threshold)])text = im.axes.text(j, i, valfmt(data[i, j], None), **kw)texts.append(text)return textsvegetables = ["cucumber", "tomato", "lettuce", "asparagus","potato", "wheat", "barley"] farmers = ["Farmer Joe", "Upland Bros.", "Smith Gardening","Agrifun", "Organiculture", "BioGoods Ltd.", "Cornylee Corp."]harvest = np.array([[0.8, 2.4, 2.5, 3.9, 0.0, 4.0, 0.0],[2.4, 0.0, 4.0, 1.0, 2.7, 0.0, 0.0],[1.1, 2.4, 0.8, 4.3, 1.9, 4.4, 0.0],[0.6, 0.0, 0.3, 0.0, 3.1, 0.0, 0.0],[0.7, 1.7, 0.6, 2.6, 2.2, 6.2, 0.0],[1.3, 1.2, 0.0, 0.0, 0.0, 3.2, 5.1],[0.1, 2.0, 0.0, 1.4, 0.0, 1.9, 6.3]])fig, ax = plt.subplots()im, cbar = heatmap(harvest, vegetables, farmers, ax=ax,cmap="YlGn", cbarlabel="harvest [t/year]") texts = annotate_heatmap(im, valfmt="{x:.1f} t")fig.tight_layout() plt.show()35.圖像顯示
在Matplotlib中繪制圖像的最常見的方法是使用imshow().
另外,PIL(Python Imaging Library)是Python常用的圖像處理庫,而Pillow是PIL的一個友好Fork,提供了廣泛的文件格式支持,強大的圖像處理能力,主要包括圖像儲存、圖像顯示、格式轉換以及基本的圖像處理操作等。
35.1.圖像插值
在顯示圖像之前可以對圖像進行插值。 在下面,我們將顯示相同的數組,并使用三種不同的插值方法進行插值。
A[i,j]處的像素中心繪制在i + 0.5,i + 0.5處。 如果使用interpolation=‘nearest’,則由(i,j) 和 (i+1,j+1)界定的區域將具有相同的顏色。 如果使用插值,則像素中心的顏色將與最接近的顏色相同,但是其他像素將在相鄰像素之間插值。
為了防止在進行插值時產生邊緣效應,Matplotlib將輸入數組的邊緣填充相同的像素:如果有一個5x5數組,其顏色為a-y,如下所示:
Matplotlib計算插值并在填充數組上調整大小
然后提取結果的中心區域。
這種方法可以繪制一個數組的整個范圍而沒有邊緣效應,例如,可以使用不同的插值方法將多個具有不同大小的圖像相互層疊。 復雜的內插還意味著性能下降; 為了獲得最佳性能或非常大的圖像,建議使用插值interpolation=‘nearest’。
import numpy as np import matplotlib.pyplot as pltA = np.random.rand(5, 5)fig, axs = plt.subplots(1, 3, figsize=(10, 3)) for ax, interp in zip(axs, ['nearest', 'bilinear', 'bicubic']):ax.imshow(A, interpolation=interp)ax.set_title(interp.capitalize())ax.grid(True)plt.show()35.2.將圖像數據導入Numpy數組
Pillow庫支持加載圖像數據。
這是一個24位 RGB PNG圖像(R,G,B分別為8比特)。 根據獲取的數據位置,還有可能會遇到的其他類型的圖像,如RGBA圖像,該圖像允許透明或單通道灰度(亮度)圖像。
import matplotlib.image as mpimgimg = mpimg.imread('cat.png') print(img) 輸出結果: [[[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]...[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]][[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]...[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]][[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]...[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]]...[[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]...[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]][[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]...[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]][[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]...[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]]]35.3.將numpy數組繪制為圖像
將數據存儲在numpy數組中(通過導入或生成), 然后渲染它。 在Matplotlib中,這是使用imshow()函數執行的。 在這里,我們使用了plot對象。
import matplotlib.pyplot as plt import matplotlib.image as mpimgimg = mpimg.imread('cat.png') print(img)imgplot = plt.imshow(img) plt.show() from PIL import Image import matplotlib.pyplot as plt img = Image.open('cat.png') # img = mping.imread('cat.png') gray = img.convert('L') # 其中img.convert指定一種色彩模式:L (8-bit pixels, black and white) # 分離rgba r, g, b, a = img.split() plt.figure("girl")def setPlot(num, title):# subplot(nrows, ncols, plot_number)# 圖表的整個繪圖區域被等分為numRows行和numCols列,然后按照從左到右、從上到下的順序對每個區域進行編號,左上區域的編號為1plt.subplot(2, 3, num)plt.title(title)plt.axis('off')setPlot(1, 'origin') plt.imshow(img)setPlot(2, 'gray') plt.imshow(gray, cmap='gray')setPlot(3, 'gray') plt.imshow(gray, cmap='gray')setPlot(3,'rgba') # 合并rgba plt.imshow(Image.merge('RGBA', (r, g, b, a)))setPlot(4, 'r') plt.imshow(r)setPlot(5, 'g') plt.imshow(g)setPlot(6, 'b') plt.imshow(b)plt.show()總結
以上是生活随笔為你收集整理的34.35.热图(heatmap)、创建带注释的热图、使用辅助函数的代码样式、图像显示、图像插值、将图像数据导入Numpy数组、将numpy数组绘制为图像的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大众id保养后充电里程变低怎么回事?
- 下一篇: 1_自然语言处理简介、数据源、应用领域、