Логарифмическая цветовая полоса в матовой плоскости

Я хотел бы, чтобы цвета точек на графике рассеяния соответствовали значению доли пустот, но в логарифмическом масштабе для усиления различий. Я сделал это, но теперь, когда я делаю plt.colorbar(), он отображает журнал доли пустот, когда мне действительно нужна фактическая доля пустот. Как я могу сделать шкалу журнала на цветной панели с соответствующими метками доли пустот, которая принадлежит [0.00001,1]?

Вот образ сюжета, который у меня есть сейчас, но цветная панель с недействительной меткой не помечена соответствующим образом, чтобы соответствовать истинной доли пустот, а не журналу.

current plot

fig = plt.figure()
plt.scatter(x,y,edgecolors='none',s=marker_size,c=np.log(void_fraction))
plt.colorbar()
plt.title('Colorbar: void fraction')

Спасибо за вашу помощь.

Ответ 1

Теперь есть раздел документации, описывающий как работает сопоставление цветов и нормализация (это ссылка на документацию по разработке, но применяется к все версии mpl. В ближайшее время это будет в документации на главную страницу.

Способ отображения matplotlib выполняется в два этапа: сначала функция Normalize (завершена подклассами matplotlib.colors.Normalize), которая отображает данные, которые вы вставляете в [0, 1]. Второй шаг отображает значения в пространстве [0,1] → RGBA.

Вам просто нужно использовать класс нормализации LogNorm, переданный с norm kwarg.

plt.scatter(x,y,edgecolors='none',s=marker_size,c=void_fraction,
                norm=matplotlib.colors.LogNorm())

Если вы хотите масштабировать/настраивать данные для построения графика, лучше matplotlib сделать преобразования, чем делать это самостоятельно.

  • Normalize doc
  • LogNorm doc
  • matplotlib.color doc