Тип структуры для x, y и z, который вам нужен, проще использовать meshgrid
. Кроме того, чтобы иметь много значений x от -1 до 1, np.linspace(-1,1,N)
делит диапазон на четные интервалы N.
Используя meshgrid
, z
можно вычислить в одной строке, используя numpy векторизация . Это выполняется намного быстрее.
Чтобы установить повторяющийся цвет, можно использовать cycli c colormap , например hsv
. Там последний цвет совпадает с начальным цветом.
import numpy as np
from matplotlib import pyplot as plt
x, y = np.meshgrid(np.linspace(-1,1,100), np.arange(1,11,1))
z = (y * x**3) % 2*np.pi
plt.scatter(x, y, c=z, s=6, cmap='hsv')
plt.yticks(range(1,11))
plt.show()
![resulting plot](https://i.stack.imgur.com/hHGY8.png)
В качестве альтернативы можно создать симметричную c цветовую карту с учетом цветов от и существующая карта и объединение их с одинаковыми цветами в обратном порядке.
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.colors as mcolors
colors_orig = plt.cm.viridis_r(np.linspace(0, 1, 128))
# combine the colors with the reversed array and build a new colormap
colors = np.vstack((colors_orig, colors_orig[::-1]))
symcmap = mcolors.LinearSegmentedColormap.from_list('symcmap', colors)
x, y = np.meshgrid(np.linspace(-1,1,100), np.arange(1,11,1))
z = (y * x**3) % 2*np.pi
plt.scatter(x, y, c=z, s=6, cmap=symcmap)
plt.yticks(range(1,11))
plt.show()