Совместим ли полный обратно matplotlib 3.1.1 с matplotlib 2.2.4? - PullRequest
0 голосов
/ 30 октября 2019

У меня есть какой-то устаревший код, который создает графики с помощью matplotlib 2.2.4. Для нового кода я использую некоторые новые функции matplotlib 3.1.1, но я не знаю, вызовет ли это проблемы с моим унаследованным кодом. Знаете ли вы, если matplotlib 3.1.1 полностью обратно совместим с matplotlib 2.2.4?

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

Новая функция в версии 3.1.1, которую я использую, это оси Zoom.

import matplotlib.pyplot as plt
import numpy as np

X = np.linspace(0, 10)
Y1 = np.sin(x) + x + np.random.randn(50)
Y2 = np.sin(x) + 0.4 + np.random.randn(50)

ax = plt.subplot(111)
ax.plot(X,Y1,X,Y2)

axins = ax.inset_axes([0.3, 0.6, 0.2, 0.2])
axins.plot(X,Y1,X,Y2)

x1, x2, y1, y2 = 0, 1, 0, 2
axins.set_xlim(x1, x2)
axins.set_ylim(y1, y2)
ax.indicate_inset_zoom(axins)

Я ожидаю полной совместимости со всеми командами, доступными в версии 2.2.4 в версии 3.1.1,тем не менее, я хочу знать, был ли у кого-то опыт с проблемами или что-то известно об этом.

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Как уже отмечалось, между версиями всегда есть некоторые изменения, поэтому у вас никогда не будет "полной совместимости". Вы найдете все изменения API в Изменениях API и в ссылке на "старые изменения API" в.

Но, возможно, вы просто хотели бы продолжить использовать matplotlib 2.2.4. В этом случае код в вопросе будет выглядеть так:

import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes, mark_inset

x = X = np.linspace(0, 10)
Y1 = np.sin(x) + x + np.random.randn(50)
Y2 = np.sin(x) + 0.4 + np.random.randn(50)

ax = plt.subplot(111)
ax.plot(X,Y1,X,Y2)

axins = inset_axes(ax, width="100%", height="100%", 
                   bbox_to_anchor=[0.3, 0.6, 0.2, 0.2], 
                   bbox_transform=ax.transAxes, borderpad=0.0)
axins.plot(X,Y1,X,Y2)

x1, x2, y1, y2 = 0, 1, 0, 2
axins.set_xlim(x1, x2)
axins.set_ylim(y1, y2)
mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="0.5")

plt.show()
0 голосов
/ 30 октября 2019

Intro

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

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

Имейте в виду, что единственное реальное ограничение для знания - это прежде чем вы отправляете графики своим клиентам. У вас есть свобода регенерировать и осматривать все эти участки локально с новой версией. То, что вы ищете, это в основном регрессионный тест кода, возможно, с визуальным осмотром в качестве критерия теста.

Изменения

Произошли два основных измененияво время переходов между версией 1 и 2, а затем 2 и 3 в matplotlib: изменения API и изменения стиля. Оба документа полностью документированы, как и следовало ожидать от такой зрелой библиотеки, как matplotlib.

API

Изменения API задокументированы здесь: https://matplotlib.org/api/api_changes.html. Учитываякод, который вы показываете, я бы не ожидал каких-либо серьезных несовместимостей. Я заметил одно изменение, которое заключается в том, что новый API фактически перехватывает неправильные аргументы ключевых слов, а не позволяет им проходить через них. Это простое исправление, описанное ниже.

Стиль

Изменения стиля описаны здесь: https://matplotlib.org/3.1.1/users/dflt_style_changes.html. По моему опыту, они оказывают более существенное влияниепри переходе от старого кода. Например, цвета линий и выбор ограничений по осям по умолчанию изменились с версии 1 на версию 2.

Помимо сохранения ваших rcparams с использованием таблицы стилей версии 2, вам, возможно, придется пройтись и настроить некоторые мелочи, такие как Formatter с и Locator с здесь и там. Вот ссылка на манипулирование стилями: https://matplotlib.org/3.1.1/tutorials/introductory/customizing.html.

Тестирование

Самый простой способ заставить ваш код работать - это интегрировать старую базу кода в изолированную виртуальную средув выделенной ветке. Я предполагаю, что у вас есть контроль версий, который поддерживает последнее. Вы можете следовать любому приличному руководству, чтобы очень быстро настроить venv, как здесь: https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/. В качестве альтернативы, вы можете пойти с чем-то более тяжелым, как conda: https://docs.conda.io/projects/conda/en/latest/user-guide/getting-started.html.

В любом случае выможет иметь среду, которая принадлежит только вам, имеет правильную версию Python и Matplotlib и не влияет на любой другой код где-либо еще для тестирования. После того, как вы сгенерировали все графики, которые вам нужны, вы можете объединить веткус интегрированным кодом обратно в любую ветвь, в которую он должен войти, и при необходимости удалите созданную вами виртуальную среду.

Случайные мысли

Если только нет некоторыхВ связи с конкретными договорными обязательствами, некоторые изменения в ваших участках могут быть полезными. Вы всегда можете проверить вещи ваших клиентов для одобрения. Важно, конечно, сначала понять, как получить идентичные графики с новой версией, прежде чем приступить к настройке «улучшения».

Заключение

Пока этот подходпочти наверняка принесет результаты, которые вы хотите, нет никаких гарантий в этой жизни. Пункты 4 и 5 в файле matplotlib LICENSE фиксируют эту неопределенность. Тем не менее, мне трудно представить себе код matplotlib v2, который вы не сможете настроить так, как вам нужно, в v3. Вы никогда не узнаете, насколько это просто, пока не попробуете. В то время как связанные документы изменений могут подготовить вас, на самом деле заранее знать точно нельзя. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...