Цветовая гамма симметричного бревна на контурном графике matplotlib
Как создать контурный график со шкалой символьного (симметричного журнала) для контуров. т.е. логарифмическая шкала, которая показывает как отрицательные, так и положительные значения.
Одна возможность будет работать на этом примере:
http://matplotlib.org/examples/pylab_examples/contourf_log.html
Что дает этот рецепт для масштаба журнала:
from matplotlib import pyplot, ticker
cs = pyplot.contourf(X, Y, z, locator=ticker.LogLocator())
Однако это не учитывает отрицательные значения. E сть ticker.SymmetricalLogLocator()
, что может быть решением, но, похоже, не так много документации.
РЕДАКТИРОВАТЬ:
Для пояснения (поскольку запрос отрицательных значений в лог-шкале может показаться бессмысленным), то, что я хочу, это то же самое, что шкала "symlog", предоставленная на осях matplotlib. На графике ниже (взятом из другого поста по обмену стека) показан символ на оси абсцисс. Это логарифмическая шкала, но она обрабатывает отрицательные значения понятным для зрителя способом.
Я хочу такой же масштаб, но для цветовой шкалы на контуре или контуре.
1 ответ
Я наткнулся на этот поток, пытаясь сделать то же самое, то есть построить большой диапазон значений как в положительном, так и в отрицательном направлении. Кроме того, я хотел, чтобы детализация была такой же хорошей, как в imshow.
Оказывается, это можно сделать с помощью "ticker.MaxNLocator(nbins)", где nbins может быть установлен на высокий уровень, чтобы иметь высокую степень детализации, например, установить nbins на 100.
Я также хотел иметь хорошее форматирование тикера в стиле латекса, для которого я недавно нашел решение для Stackru.
Я просто опубликую здесь фрагмент кода из одного из классов, частью которого он является, чтобы каждый, кто захочет, мог получить основную идею о том, как он работает. Я использую это решение для создания нескольких графиков, как показано на рисунке ниже.
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
# function for nice Latex style tick formatting
# copied from
# http://stackru.com/questions/25983218/
# scientific-notation-colorbar-in-matplotlib
# output formating for colorbar in 2D plots
def fmt(x, pos):
a, b = '{:.2e}'.format(x).split('e')
b = int(b)
return r'${} \times 10^{{{}}}$'.format(a, b)
# A confourf function I use inside one of my classes
# mainly interesting are the "plot" and "cbar" lines
def Make2DSubPlot(self, posIdent, timeIdx,typeIdx):
plt.subplot(posIdent)
y = self.radPos
x = self.axPos
z = self.fieldList[timeIdx][typeIdx]
plot = plt.contourf(x, y, z, locator=ticker.MaxNLocator(100), \
aspect='auto',origin='lower')
cbar = plt.colorbar(plot, orientation='vertical', \
format=ticker.FuncFormatter(fmt))
cbar.ax.set_ylabel(self.labelList[typeIdx])
plt.xlabel(self.labelList[self.iax])
plt.ylabel(self.labelList[self.iax])