Получение меток при использовании логарифмической шкалы

#python #matplotlib #formatting #visualization

Вопрос:

Я создаю цветовую диаграмму с логарифмической шкалой (база 2) и пытаюсь получить ярлычки с цветовой панели, чтобы использовать их где-то еще. Однако то, что показано на графике , отличается от того, что получается get_yticks() : рисунок отображается [1,2,4,8,16] , в то время как метод дает мне [ 0.5 1. 2. 4. 8. 16. 32. ] . Я делаю что-то не так? Должен ли я вообще игнорировать первую и последнюю запись (по какой-то причине)?

Пример кода выглядит следующим образом:

 from matplotlib.figure import Figure 
from matplotlib.colors import LogNorm
from matplotlib.ticker import FuncFormatter


x = [0, 1, 2, 3, 4]
y = [0, 1, 2, 3, 4]
z = [[1, 1, 1, 1], [8, 8, 8, 8], [2, 2, 2, 2], [16, 16, 16, 16]]

# Creating figure and axis
fig = Figure(figsize=(4.0, 4.0))
ax = fig.subplots(1, 1)
fig.subplots_adjust(left=0.20, right=0.80, bottom=0.070,top=0.92)

# Plotting and getting colorbar
cbar = ax.pcolor(x, y, z, cmap='turbo', norm=LogNorm(1, 16))

# Getting axis extent
bbox = ax.get_window_extent().transformed(fig.transFigure.inverted())
# Creating axis for colorbar
cax = fig.add_axes([1.05*bbox.x1, bbox.y0, 0.1*(bbox.x1-bbox.x0), (bbox.y1-bbox.y0)])

# Adding colorbar
fig.colorbar(cbar, cax=cax)
# Setting logarithm scale without decimals
cax.set_yscale('log', base=2)
formatter = FuncFormatter(lambda y, _: '{:.0f}'.format(y))
cax.yaxis.set_major_formatter(formatter)

# Getting ticks
print(cax.get_yticks())  # Output: [ 0.5  1.   2.   4.   8.  16.  32. ]

fig.savefig('log_test.pdf')
 

Что приводит к этой цифре:
График в логарифмическом масштабе, основание 2

Редактировать: Я заметил, что даже на простом графике, использующем логарифмическую шкалу, возвращенные галочки get_yticks() «неправильные». Вот пример:

 from matplotlib.figure import Figure 
from matplotlib.ticker import FuncFormatter

x = [0, 1, 2, 3, 4]
y = [1, 1, 1, 1, 1]

fig = Figure(figsize=(4.0, 4.0))
ax = fig.subplots(1, 1)
fig.subplots_adjust(left=0.20, right=0.80, bottom=0.070,top=0.92)

ax.plot(x, y)

ax.set_yscale('log', base=2)
formatter = FuncFormatter(lambda y, _: '{:.0f}'.format(y))
ax.yaxis.set_major_formatter(formatter)

print(ax.get_yticks()) # Output: [0.125 0.25  0.5   1.    2.    4.    8.   ]

fig.savefig('log_test.pdf')
 

Фигура выглядит так:

Простой участок с бревенчатым масштабом

Однако в этом случае возвращаемое значение равно [0.125 0.25 0.5 1. 2. 4. 8. ] , что показывает , что я даже не могу использовать обходной путь для пропуска первого и последнего значений.

Комментарии:

1. Посмотри на это .

2. Я не знаю, как это может помочь. Кроме того, он, похоже, не связан с самой цветовой панелью (проверьте обновленный вопрос).

Ответ №1:

В то время как я ищу лучшее решение — поскольку я все еще не понимаю возвращаемых значений get_yticks() , я нашел решение, чтобы проверить, находятся ли галочки в диапазоне ylim:

 from matplotlib.figure import Figure
from matplotlib.ticker import FuncFormatter

x = [0, 1, 2, 3, 4]
y = [1, 1, 1, 1, 1]

fig = Figure(figsize=(4.0, 4.0))
ax = fig.subplots(1, 1)
fig.subplots_adjust(left=0.20, right=0.80, bottom=0.070, top=0.92)

ax.plot(x, y)

ax.set_yscale('log', base=2)
formatter = FuncFormatter(lambda y, _: '{:.0f}'.format(y))
ax.yaxis.set_major_formatter(formatter)

yticks = ax.get_yticks()
print(yticks)  # Output with extra ticks: [0.125 0.25  0.5   1.    2.    4.    8.   ]

ylim = ax.get_ylim()
print("ylim", ylim) # Output: ylim (0.4665164957684037, 2.1435469250725863)

print([tick for tick in yticks if ylim[0] <= tick <= ylim[1]]) # Desired output: [0.5, 1.0, 2.0]


fig.savefig('log_test.pdf')
 

Это должно удалить все нежелательные галочки.