#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. Еще раз спасибо