pyplot — опция для установки логнормы цветовой карты

#python #pandas #matplotlib

#python #панды #matplotlib

Вопрос:

Я боролся с этим уже несколько часов. Я работаю над написанием удобного интерфейса, который позволит моим коллегам легко обрабатывать / анализировать тестовые данные. Итак, функция представляет собой прославленный вызов plt.scatter(), но включает в себя множество опций.

Я смог покопаться в API, чтобы найти большинство необязательных вызовов вне функции (например, ax.set_xlim). Но я действительно борюсь с тем, как при необходимости поместить ось z / цветовую карту в логнорму.

В моей предыдущей версии просто был миллиард вложенных if операторов, и если вызывался z_log, то

 if z_log:
    im = ax1.scatter(temp[x], temp[y1], c=temp[z1], norm=matplotlib.colors.LogNorm(), vmin=z_range[0], vmax=z_range[1], cmap="jet")
  

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

     if z:
        cbar = fig.colorbar(im, ax=ax1, label=z)
        im.set_cmap('jet')
        if z_range:
            im.set_clim(z_range[0], z_range[1])
  

но я не могу заставить LogNorm работать. В настоящее время я пытаюсь

         if z_log:
            im.set_norm(matplotlib.colors.LogNorm())
  

что дает мне впечатляюще длинную обратную трассировку .. в какой-то момент упоминается деление на ноль. Обычно я бы сказал, что это проблема для построения журнала, но 1) Я фильтрую данные, чтобы исключить любые отрицательные значения, и 2) если я добавлю исходное утверждение в вызов функции ...scatter(... norm=matplotlib.colors.LogNorm()...) , тогда оно будет работать отлично.

Я попытался добавить необязательные аргументы для vmin / vmax в вызов LogNorm, но ничего не работает.

Есть предложения?

ОБНОВЛЕНИЕ: предварительное определение метода нормализации, похоже, сработало, но теперь я застрял на настройке диапазона z-масштаба. Основываясь на комментариях, я смог успешно добавить флаг для включения / отключения логарифмического построения цветовой панели.

Мне было рекомендовано не использовать clim, а использовать vlim внутри исходного вызова scatter() для установки диапазона. Я думал, что аналогичный подход, заключающийся в «предварительном заполнении» значений, а затем всегда его включении, будет работать. Код ниже

     # Find colormap min/max range. 
    my_vmin, my_vmax = 0.0, 0.0
    if z:
        my_vmin = temp[z].min
        my_vmin = temp[z].max
        if z_range:
            my_vmin = z_range[0]
            my_vmax = z_range[1]

    if isinstance(y1, list):
        for i in range(len(y1)):
            if z: c = temp[z]
            else: c = colors[i]
            im = ax1.scatter(temp[x], temp[y1[i]], label=y1[i], c=c, norm=my_norm, vmin=my_vmin, vmax=my_vmax)
  

Теперь это отлично работает, если я действительно попрошу раскрасить маркеры по данным. Однако, если я попытаюсь использовать константу, она жалуется.

Если я удалю vmin / vmax из вызова функции и буду полагаться на set_clim() … похоже, что это действительно соответствует моим ожиданиям (т. Е. Я хочу, чтобы цвета маркеров и цветовая панель масштабировались в соответствии с моими входными данными)… Я могу провести еще немного исследований по сравнению с clim и vlim и просто заявить об успехе

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

1. Не могли бы вы просто добавить переменную заранее, my_norm = matplotlib.colors.Normalize() , if z_logg: my_norm = matplotlib.colors.LogNorm() . И после ax1.scatter(..., norm=mynorm) этого ? Также будьте осторожны, чтобы ваши значения были строго положительными log , чтобы быть действительными. Аналогично, начните с cmin=None и при необходимости установите для него значение перед вызовом scatter . Также обратите внимание, что cmin и vmin — это очень разные понятия. Кстати, «jet» редко является адекватной цветовой картой по умолчанию .

2. О боже, это полностью сработало … Такая личная боль … Большое вам спасибо! Что касается clim… Я просмотрел API и нашел только аргументы vmin в функции set_clim. Я предполагаю, что ваша рекомендация будет заключаться в запросе минимальных / максимальных значений диапазона данных и предустановки vmin / vmax, чтобы я мог включить его и в исходный вызов? Это, конечно, дает возможность изменять этот диапазон по желанию. Я немного покопаюсь, чтобы понять разницу между cmin и vmin. Еще раз спасибо