簡體   English   中英

Matplotlib | 應用對數刻度時繪圖表示的變化

[英]Matplotlib | Change in plot representation when applying logarithmic scale

給定一組要在 3D 圖上表示的點(作為散點圖),我認為由於hist2d和使用weightshist2d在 2D 而不是 3D 中繪制相同的數據會很有趣。

該數據具有低值和高值(相隔一些數量級),因此當表示為hist2d圖時,某些數據“丟失”(主要是較低的點)。

為了更好地了解所有值,我以對數刻度表示了相同的圖。 結果,我注意到了兩件不同的事情。 首先,除了被表示的數據中包含的點之外的所有點都顯示為白色像素(看起來所有這些點在對數刻度中都被忽略)而不是作為最低點着色(另請參見色帶的最低部分,它是白色而不是藍色)。 其次,並不那么重要的是,色帶中的標度值表示為 10 的冪。

所以我的問題涉及這兩點,如何用藍色表示所有“白色”區域,即最低點的顏色,以及如何調整色帶以不顯示 10 的冪,而是表示數字正常(1, 10, 100 ...)?

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np


# Data
x = [8 for i in range(65)]
y = [75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11]
z = [895, 800, 710, 635, 565, 500, 440, 392, 347, 304, 268, 235, 205, 179, 156, 135, 117, 101, 89, 76, 64, 55, 47, 40, 34, 29, 25, 20, 16, 14, 12, 9, 7, 6, 5, 4, 3, 2.5, 2, 1.7, 1.3, 1, 0.775, 0.60, 0.45, 0.35, 0.25, 0.18, 0.14, 0.10, 0.07, 0.05, 0.035, 0.025, 0.020, 0.015, 0.010, 0.007, 0.006, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005]

fig = plt.figure()

# First plot
fig.add_subplot(211)

plt.hist2d(x, y, weights=z, bins=len(x), cmap='plasma')
cb = plt.colorbar(extend='both')
cb.set_label('height')

# Second plot. Using log scale
fig.add_subplot(212)

plt.hist2d(x, y, weights=z, bins=len(x), norm=mpl.colors.LogNorm(vmin=min(z), vmax=max(z)), cmap='plasma')
cb = plt.colorbar(extend='both')
cb.set_label('height')

plt.show()

(我想所有的 x 值都是 8,為了創建一個最小的例子。)

白色的“顏色”是因為零的對數是 NaN 或負無窮大,所以沒有顏色(顯示背景)。 將該背景顏色更改為“等離子”顏色圖的 0 值:

plt.gca().set_facecolor(plt.get_cmap('plasma')(0))

為了避免使用科學記數法,並且只讓刻度大於 1,您可以更改顏色條的刻度和刻度格式。

因為z的最小值為零,所以在 0 和 1 之間會丟失很多顏色空間。將vmin設置為 1(或 0.99)可以避免這種情況。

from matplotlib import ticker

fig.add_subplot(212)
plt.gca().set_facecolor(plt.get_cmap('plasma')(0))
plt.hist2d(x, y, weights=z, bins=len(x), norm=mpl.colors.LogNorm(vmin=1, vmax=max(z)), cmap='plasma')
cb = plt.colorbar(extend='both')
cb.set_label('height')
cb.set_ticks([1, 10, 100] + list(range(500, max(z), 500))) 
cb.ax.yaxis.set_major_formatter(ticker.ScalarFormatter()) # remove the scientific notation
cb.ax.yaxis.set_minor_locator(ticker.NullLocator()) # optionally remove the minor ticks

結果圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM