Симметричный локатор логов, отсекающий верхние значения (Python)
Я пытаюсь построить график силограммы контура электрического поля, но программа почему-то обрезает мои верхние значения.
Вот код:
def plotEField2D(data_in, ax, fig, field='Ey', xlim=100, ylim=100, num_levels=20,
contours=False, num_lines=10):
electric_data = data_in.electric
ax.set_xlim(-xlim, xlim)
ax.set_ylim(-ylim, ylim)
ax.set_title('2D ' + field + ' Contour')
ax.set_xlabel('x (nm)')
ax.set_ylabel('y (nm)')
e_data = pd.pivot_table(electric_data[['x','y', field]],
values=field, index='y', columns='x')
e_data = e_data.interpolate().fillna(0)
mymax = np.max(e_data.values)
mymin = np.min(e_data.values)
loc = matplotlib.ticker.SymmetricalLogLocator(linthresh=1e-2, base=10)
e = ax.contourf(e_data.columns, e_data.index, e_data.values,
cmap=plt.cm.coolwarm,
locator=matplotlib.ticker.SymmetricalLogLocator(linthresh=1e-2, base=10),
norm=matplotlib.colors.SymLogNorm(linthresh=1e-2,
linscale=0.1))
fig.colorbar(e, ax=ax, format='%.0e')
Проблема находится где-то в SymmetricLogLocator, и я попробовал несколько исправлений.
Базовый результат таков: Обратите внимание на маскировку высоких значений и обрезку цветовой полосы при 1e5 (мой максимум ~ 1e6)
a) Я попытался использовать функцию ticker.refresh(), чтобы заставить локатор обновлять значения vmin и vmax на основе текущего графика, но это просто линеаризует мой график следующим образом: Обратите внимание, что макс вернулся к 1e6, но теперь линеаризован, что я не хочу.
б) Использование функции ticker.autoscale() приводит к следующей ошибке:
File "C:\Users\Christian\Anaconda3\lib\site-packages\matplotlib\ticker.py", line 1480, in autoscale
return self.view_limits(*self.axis.get_view_interval())
AttributeError: 'NoneType' object has no attribute 'get_view_interval'
Я не знаю, что делать с этой ошибкой. Я не уверен, что еще нужно сделать, чтобы попытаться исправить проблему.
Я подозреваю, что, поскольку мое максимальное значение равно 9.7e5, а не 1e6, функция Locator по какой-то причине обрезает все, что находится выше линии 1e5. Я пытался найти способ заставить локатор иметь значение vmax, равное максимуму таблицы, но это решение ускользало от меня. Я бы предпочел не делать исправления, когда я добавляю более высокое значение в таблицу, чтобы заставить локатор рассматривать значения около 1e6, но я не против, если это то, что я должен сделать.