【问题标题】:Matplotlib Scatter Plot Returns Different Plots in Different VersionsMatplotlib 散点图返回不同版本的不同图
【发布时间】:2021-12-11 13:51:10
【问题描述】:

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

最近我们正在研究具有复杂值的函数,并通知散点图输出在 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()


系统详情:

  • 操作系统:Linux - Ubuntu 20.04
  • Python:Python 3.8.10
  • GCC:[GCC 9.3.0]
  • Matplotlib:[3.0.3, 3.4.3]
  • Numpy:1.19.1

【问题讨论】:

  • 感谢您提及我更新了问题。 > 我想知道为什么会这样,matplotlib 有什么问题。如果这是一个错误,那么 matplotlib 为不同版本的特定代码绘制不同的数字可能会很糟糕。
  • 您是否尝试计算库中的实部?您是否考虑过使用numpy 而不是math
  • @JohanC 是的,我试过了。他们都没有解决它。以仅存在真实部分的方式过滤数据并没有任何区别,使用numpy 而不是math 会添加一个新警告RuntimeWarning: invalid value encountered in double_scalars,但仍然没有改善。
  • 请包含一个不依赖于您的库的示例。我们真的不知道GI.plot 做了什么。
  • @JodyKlymak 你是对的。谢谢你的观点。我在问题末尾添加了一个直接使用 scatter 的示例。

标签: python matplotlib plot scatter-plot generative-art


【解决方案1】:

问题在于 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:

【讨论】:

    猜你喜欢
    • 2020-12-19
    • 2021-10-06
    • 2018-04-19
    • 2013-01-04
    相关资源
    最近更新 更多