matplotlib 3.1.1完全向后兼容matplotlib 2.2.4吗?

时间:2019-10-30 16:54:28

标签: python matplotlib

我有一些旧代码,可使用matplotlib 2.2.4创建图。对于新代码,我使用了matplotlib 3.1.1的一些新功能,但是我不知道它是否会导致我的旧代码出现问题。您知道matplotlib 3.1.1是否与matplotlib 2.2.4完全向后兼容吗?

对我来说,不知道更新是不可行的,因为我无法弄乱已经直接发送给某些客户的地块。

我正在使用的3.1.1版本中的新功能是“缩放区域插入轴”。

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)

我希望与3.1.1中的2.2.4版本中的所有命令完全兼容,但是,我想知道某人是否有任何问题经历或对此有所了解。

2 个答案:

答案 0 :(得分:0)

简介

通常,没有版本之间的完美兼容性。但是,对于许多用例来说,向后兼容可能会有效地完成。您只有实际尝试使用确切的代码库才能知道。下面的概述不能保证您会完美过渡,但可能会帮助您消除所有差异。

  

对我来说,不知道更新是不可行的,因为我无法弄乱已经直接发送给某些客户的地块。

请记住,唯一真正了解的知识是在将地块发送给客户之前。您可以自由使用新版本在本地重新生成和检查所有这些图。您正在寻找的基本上是代码的回归测试,可能以外观检查作为测试标准。

更改

在版本1和版本2之间以及随后的版本2和版本3之间的过渡期间,发生了两个主要更改: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。

除了使用版本2样式表保留rcparams之外,您可能还需要遍历此处和那里的一些小事情,例如Formatters and Locators。以下是操作样式的链接: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,并且不会影响其他任何要测试的代码。一旦生成了所有图,就需要为了您的满意,您可以将带有集成代码的分支合并回它需要进入的任何分支,并有选择地删除您创建的虚拟环境。

随机思想

除非涉及一些非常具体的合同义务,否则对地块进行一些更改可能是一件好事。您总是可以由客户来审批。当然,重要的是首先要了解如何获得与新版本相同的地块,然后再开始对事物进行“改进”。

结论

虽然这种方法几乎可以肯定会产生您想要的结果,但是这一生没有保证。 matplotlib LICENSE file中的条款4和5捕获了这种不确定性。但是,我很难想象matplotlib v2代码将无法完全按照您在v3中的要求进行调整。尝试之前,您将永远不知道这有多么容易。虽然链接的变更文档可以为您做准备,但确实无法提前知道。祝你好运!

答案 1 :(得分:0)

如前所述,版本之间总是会有一些变化,因此您永远不会具有“完全兼容性”。您可以在API changes和其中的“旧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()