Симметричный локатор логов, отсекающий верхние значения (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, но я не против, если это то, что я должен сделать.

0 ответов

Другие вопросы по тегам