簡體   English   中英

Matplotlib 顏色條:出現一些不帶標簽的刻度

[英]Matplotlib colorbar: some ticks appear without labels

我正在使用 plr.scatter 和對數刻度,並且我正在嘗試向顏色條添加一些特定的刻度值,但它似乎真的很隨意。 請參閱示例:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
import matplotlib
from matplotlib.ticker import LogFormatter

x, y = np.meshgrid(np.linspace(0, 1, 30), np.linspace(0, 1, 30))
z = x**2 + 15*y**3 + 1.5
plt.figure(figsize=(9, 4.5))
plt.scatter(x, y, c=z, cmap=cm.jet, norm=matplotlib.colors.LogNorm(), vmin=1, vmax=20)
formatter = LogFormatter(10, labelOnlyBase=False) 
cbar = plt.colorbar(ticks=[1, 2, 5, 10, 15, 20], format=formatter)

此代碼生成了所有必需的主要刻度,加上一些次要刻度,但僅標記為 1 和 10,而我需要在顏色欄中看到所有數字。 起初我雖然是因為 1 和 10 是 integer 10 的冪,而其他數字不是,但是...

在此處輸入圖像描述

...如果我將日志基數更改為 2,我們可以在 1 和 2 處看到刻度標簽,它們是 2 的冪,但我們也可以在 5、10 和 20 處看到標簽,但不是。 這次也沒有出現 15,但是如果我嘗試添加 17 它可以工作(圖片上未顯示,但確實如此)

formatter = LogFormatter(2, labelOnlyBase=False)

在此處輸入圖像描述

這是什么魔法,我如何讓 matplotlib 將我想要的標簽准確地添加到刻度? 我可以通過使用手動完成

cbar.ax.set_yticklabels(['1', '2', '5', '10', '15', '20'])

但這似乎是多余的。 有沒有更好的辦法?

您可以使用formatter any axis刻度。 下面是示例。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
import matplotlib
from matplotlib.colors import LogNorm

x, y = np.meshgrid(np.linspace(0, 1, 30), np.linspace(0, 1, 30))
z = x**2 + 15*y**3 + 1.5
f, ax = plt.subplots(figsize=(9, 4.5))
p = plt.scatter(x, y, c=z, cmap=cm.jet, norm=LogNorm(vmin=1, vmax=20) )

v1 = np.linspace(z.min(), z.max(), 8, endpoint=True)

cbar=plt.colorbar(ticks=v1)              
cbar.ax.set_yticklabels(["{:4.2f}".format(i) for i in v1]) # add the labels

輸出

LogFormatter及其子類使用minor_thresholds參數來決定何時隱藏非十年刻度標簽以防止過度擁擠。 默認情況下,這將隱藏幾乎所有非十年標簽,但您可以增加它以允許出現更多標簽。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LogFormatter
from matplotlib.colors import LogNorm

x, y = np.meshgrid(np.linspace(0, 1, 30), np.linspace(0, 1, 30))
z = x**2 + 15*y**3 + 1.5
plt.figure(figsize=(9, 4.5))
cnorm = LogNorm(vmin=1, vmax=20)
plt.scatter(x, y, c=z, cmap=cm.jet, norm=cnorm)
# define minor_thresholds to be >= the range of the color scale
decades = np.ceil(np.log10(cnorm.vmax / cnorm.vmin))
formatter = LogFormatter(10, minor_thresholds=(decades, decades))
cbar = plt.colorbar(ticks=[1, 2, 5, 10, 15, 20], format=formatter)

彩虹點的散點圖,類似於原始帖子,但顏色條在每個明確定義的刻度值處標記

暫無
暫無

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

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