Matplotlib 散点图 Returns 不同版本的不同图

Matplotlib Scatter Plot Returns Different Plots in Different Versions

我正在为 python 开发一个名为 samila 的生成艺术生成器库,该库基于 matplotlib 散点图。它得到两个函数并将正方形 space 映射为任意形状。我们希望生成的形状对于给定的函数和给定的随机种子是相同的,以便可重现。

最近我们在研究具有复杂值的函数,并通知散点图输出在 matplotlib 的不同版本中是不一样的。

想知道为什么会这样,matplotlib有什么问题。如果这是一个错误,那么 matplotlib 为不同版本的特定代码绘制不同的图形可能会很糟糕。

因此,如果您 运行 使用 matplotlib==3.4.3:

下面的代码
from samila import *
import math
import matplotlib.pyplot as plt

def f1(x, y):
    return math.cos(x**2 * y)**1.926 - math.floor(x - y)**1.861 - math.floor(y**2 * x)**1.688

def f2(x, y):
    return x - y**1.617 - math.ceil(y)**1.477 - abs(x**2 * y) ** 1.647 - math.cos(x * y)**1.668

GI = GenerativeImage(f1, f2)
GI.generate(seed=755398)
GI.plot(color=(0.159, 0.085, 0.191), projection=Projection.POLAR, spot_size=2)
GI.save_image('art.png')
plt.show()

您将收到以下警告:

/home/user/.local/lib/python3.8/site-packages/numpy/core/_asarray.py:136: ComplexWarning: Casting complex values to real discards the imaginary part
  return array(a, dtype, copy=False, order=order, subok=True)

使用以下生成的艺术:


如果您 运行 使用 matplotlib==3.0.3 的代码,您将拥有:

Attribute Qt::AA_EnableHighDpiScaling must be set before QCoreApplication is created.
/home/user/.local/lib/python3.8/site-packages/numpy/core/_asarray.py:136: ComplexWarning: Casting complex values to real discards the imaginary part
  return array(a, dtype, copy=False, order=order, subok=True)


[编辑]:我添加了一个直接使用 matplotlib 的示例,而不是通过 Samila 使用它。如果您愿意,可以使用此脚本代替之前的脚本。

import random
import math
import matplotlib.pyplot as plt
import itertools

def f1(x,y):
    return math.cos(x**2 * y)**1.926 - math.floor(x - y)**1.861 - math.floor(y**2 * x)**1.688
def f2(x,y):
    return x - y**1.617 - math.ceil(y)**1.477 - abs(x**2 * y) ** 1.647 - math.cos(x * y)**1.668
def float_range(start, stop, step):
    while start < stop:
        yield float(start)
        start += step


data1 = []
data2 = []
range1 = list(float_range(-1*math.pi, math.pi, 0.01))
range_prod = list(itertools.product(range1, range1))
for item in range_prod:
    data1.append(f1(item[0], item[1]))
    data2.append(f2(item[0], item[1]))

color = (0.159, 0.085, 0.191)
spot_size = 0.01
projection = "polar"

fig = plt.figure()
fig.set_size_inches(10, 10)
ax = fig.add_subplot(111, projection=projection)
ax.scatter(
        data2,
        data1,
        alpha=0.1,
        edgecolors=color,
        s=spot_size)
ax.set_axis_off()
ax.patch.set_zorder(-1)
ax.add_artist(ax.patch)

plt.show()


系统详情:

问题是 matplotlib 将其绘图策略从忽略负半径点的 3.0.3 更改为绘制它们的 3.4.3

我无法使用 compare release notes 找到它,这让我很困惑。希望对这种情况有警告,避免以后出现问题。

我测试了以下更简单的代码:

data1 = [-2, -5,  2, 2]
data2 = [-2, 2, -2, 2]

fig = plt.figure()
ax = fig.add_subplot(111, projection="polar")
ax.scatter(
        data2,
        data1,
        s=30)

plt.show()

matplotlib.__version__ == 3.0.3 中我们得到:

matplotlib.__version__ == 3.4.3 时: