#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')
Редактировать: Я заметил, что даже на простом графике, использующем логарифмическую шкалу, возвращенные галочки 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')
Это должно удалить все нежелательные галочки.