Разница между matplotlib.countourf и matlab.contourf () - странные острые углы в matplotlib - PullRequest
0 голосов
/ 23 октября 2018

Я недавно мигрировал из Matlab в Python и недавно работал с Numpy и Matplotlib.Я перекодировал один из моих сценариев из Matlab, который использует функцию contlaf в Matlab, в Python, используя соответствующую функцию contourf в matplotlib.Мне удалось воспроизвести вывод в Python, за исключением того, что контурные графики не являются точно такими же, по неизвестной мне причине.Когда я запускаю функцию contourf в matplotlib, я получаю эту в остальном красивую фигуру, но у нее есть острые края на уровнях контура сверху и снизу, которых там быть не должно (см. Рис. 1 ниже, matplotlib-output).Теперь, когда я экспортирую массивы, которые я использовал в Python, в Matlab (т. Е. Точно такой же набор данных, который использовался для генерации matplotlib-contourf-plot) и использую функцию Contourf в Matlab, я получаю немного другой вывод без этих четких контуров-уровни ребер (см. рисунок 2 ниже, выход Matlab).Я использовал одинаковое количество уровней на обеих фигурах.На рисунке 3 я сделал диаграмму рассеяния тех же данных, которая показывает, что в данных нет таких острых краев, как показано на контурной диаграмме (я добавил контурные линии только для справки).Пример набора данных можно скачать по ссылке Dropbox, приведенной ниже.Набор данных содержит три txt-файла: X, Y, Z. Каждый из них представляет собой массивы 500x500, которые можно напрямую использовать с contourf (), то есть plt.contourf (X, Y, Z, ...).Код, который использовался, был

plt.contourf(X,Y,Z,10, cmap=plt.cm.jet)
plt.contour(X,Y,Z,10,colors='black', linewidths=0.5)
plt.axis('equal')
plt.axis('off')

У кого-нибудь есть идея, почему это происходит?Буду признателен за любую информацию по этому поводу!

Приветствия,

Юсси

Ниже приведены подробности моей настройки:


Python 3.7.0

IPython 6.5.0

matplotlib 2.2.3


Выход Matplotlib Matplotlib output

Matlabвывод Matlab output

Matplotlib-scatter Ссылка на набор данных

1 Ответ

0 голосов
/ 04 ноября 2018

Запутанная вещь в графике matlab заключается в том, что его цветовая шкала показывает гораздо больше уровней, чем на самом деле в графике.Следовательно, вы не видите фактические интервалы, которые очерчены.

Вы бы достигли того же результата в matplotlib, выбрав 12 вместо 11 уровней.

import numpy as np
import matplotlib.pyplot as plt

X, Y, Z = [np.loadtxt("data/roundcontourdata/{}.txt".format(i)) for i in list("XYZ")]

levels = np.linspace(Z.min(), Z.max(), 12)
cntr  = plt.contourf(X,Y,Z,levels, cmap=plt.cm.jet)
plt.contour(X,Y,Z,levels,colors='black', linewidths=0.5)
plt.colorbar(cntr)
plt.axis('equal')
plt.axis('off')

plt.show()

enter image description here

Итак, в заключение,оба графика правильные и показывают одинаковые данные.Просто уровни автоматически выбираются разные.Это можно обойти, выбрав пользовательские уровни в зависимости от желаемого внешнего вида.

...