Ручные галочки на цветовой панели - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь создать логарифмическую c цветную полосу. Я знаю, что этот вопрос уже задавался, как здесь или здесь , однако в ответах функция графика используется для создания логарифмической c цветовой шкалы. Я хочу сделать это независимо от функции сюжета. Поэтому я написал функцию, которая будет рассчитывать позиции тиков и соответственно создавать метки, но когда я пытаюсь обновить тики и метки на цветовой панели, это не работает:

Итак, допустим, у меня есть следующее сюжет.

enter image description here

Теперь моя ось выглядит так:

list(cbar.ax.get_yticklabels())
>>> [Text(1, 0.0, '$\\mathdefault{10^{0}}$'),
 Text(1, 0.5, ''),
 Text(1, 1.0, ''),
 Text(1, 1.5, ''),
 Text(1, 2.0, ''),
 Text(1, 2.5, ''),
 Text(1, 3.0, ''),
 Text(1, 3.5, '')]

После использования моей функции я получаю позицию для тиков (каждое натуральное число получает метку, остальные нет, поскольку они используются как мелкие галочки):

pos = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5]

и мои метки:

labels = ['$\\mathdefault{10^{3}}$', '', '', '', '', '', '', '', '', '', '$\\mathdefault{10^{3}}$', '', '', '', '', '', '', '', '', '', '$\\mathdefault{10^{3}}$', '', '', '', '', '', '', '', '', '', '$\\mathdefault{10^{3}}$', '', '', '', '', '']

Когда я пытаюсь изменить хотя галочки и метки:

cbar.set_ticks(pos)
cbar.set_ticklabels(labels)

Я получаю это:

[Text(1, 0.0, '$\\mathdefault{10^{0}}$'), Text(1, 0.5, ''), Text(1, 1.0, ''), Text(1, 1.5, ''), Text(1, .0, ''), Text(1, 2.5, ''), Text(1, 3.0, ''), Text(1, 3.5, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, '')]

Таким образом, добавляются дополнительные позиции, но все в позиции 0 и без метки.

Использование

cbar.ax.set_yticks(pos)
cbar.ax.set_yticklabels(labels)

тоже не работает, вместо этого:

[Text(1, 0.0, '$\\mathdefault{10^{3}}$'), Text(1, 0.5, ''), Text(1, 1.0, ''), Text(1, 1.5, ''), Text(1, .0, ''), Text(1, 2.5, ''), Text(1, 3.0, ''), Text(1, 3.5, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, '$\\mathdefault{10^{3}}$'), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, '$\\mathdefault{10^{3}}$'), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, '$\\mathdefault{10^{3}}$'), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, ''), Text(1, 0, '')]

Так что мне интересно, что я делаю неправильно, когда пытаюсь изменить метки / метки. Любая помощь очень ценится.

В случае заинтересованности здесь функции, которые я использую для создания цветовой панели и для создания новых меток и меток:

import matplotlib as mpl
import numpy as np

def make_log_ticks(current_ticks):
    min_ = np.inf
    max_ = -np.inf
    for elem in current_ticks:
        pos, val = elem.get_position()
        if val < min_:
            min_ = val
        if val > max_:
            max_ = val
    #new_ticks = []
    new_labels = []
    new_pos = []
    for i in range(int(min_*10), int(max_*10+1)):
        if i%10 == 0:
            new_pos.append(i/10)
            new_labels.append("$\\mathdefault{10^{"+str(int(val))+"}}$")
            #new_ticks.append(mpl.text.Text(1, i/10, "$\\mathdefault{10^{int(val)}}$"))
        else:
            new_pos.append(i/10)
            new_labels.append('')
            #new_ticks.append(mpl.text.Text(1, i/10, ""))
    #return new_ticks, new_pos, new_labels
    return new_pos, new_labels


def make_cbar(data, cmap=mpl.cm.jet, log=False):
    m = mpl.cm.ScalarMappable(cmap=cmap)
    if log:
        m.set_array(np.log10(list(set(data))))
        norm = plt.Normalize(np.log10(min(data)), np.log10(max(data)))
    else:
        m.set_array(list(set(data)))
        norm = plt.Normalize(min(data), max(data))
    cbar = plt.colorbar(m)
    cbar.ax.tick_params(axis='both', which='major', width=3 , length=5)
    cbar.ax.tick_params(axis='both', which='minor', width=2 , length=3)
    if log:
        pos, labels = make_log_ticks(list(cbar.ax.get_yticklabels()))
        cbar.ax.set_yticks(pos)
        cbar.ax.set_yticklabels(labels)
        return cbar, lambda c: m.cmap(norm(np.log10(c)))
    else:
        return cbar, lambda c: m.cmap(norm(c))

1 Ответ

0 голосов
/ 28 февраля 2020

Я не знал, как сказать, что цветная полоса должна быть логарифмированной c. Однако я узнал, как это сделать, на случай, если кто-нибудь натолкнется на подобную проблему:

m = mpl.cm.ScalarMappable(cmap=cmap, norm=mpl.colors.LogNorm())
norm = mpl.colors.LogNorm(min(data), max(data))
m.set_array(list(set(data)))
cbar = plt.colorbar(m)

Можно настроить Mappable на использование логарифмической c нормы. Тогда маркировка будет выполнена автоматически. Нет необходимости делать это вручную. Однако проблема, с которой я не мог изменить маркировку, все еще остается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...