Самое простое, что можно сделать в этом случае, это использовать короткую вертикальную линию маркера и установить размер маркера достаточно большим, чтобы не осталось пустого пространства.
Другим вариантом является использование tricontourf для создания заполненного изображения x, y и z.
Обратите внимание, что ни точечная диаграмма, ни tricontourf не нуждаются в сортировке точек в любом порядке. Если у вас есть точки, отсортированные в упорядоченную сетку, plt.imshow
должен дать лучший результат.
Вот некоторый код, чтобы показать, как это может выглядеть. Сначала генерируются некоторые фиктивные данные, немного похожие на пример. Поскольку x, y случайны, они не заполняют все пространство. Это может оставить некоторые пустые места на графике рассеяния. Пятна хорошо интерполированы для контура, за исключением, возможно, в углах.
import numpy as np
import matplotlib.pyplot as plt
N = 50000
xmin = 0
xmax = 0.20
ymin = -0.01
ymax = 0.01
std_sorted = np.zeros((N, 3))
std_sorted[:,1] = np.random.uniform(xmin, xmax, N)
std_sorted[:,2] = np.random.choice(np.linspace(ymin, ymax, 80), N)
std_sorted[:,0] = np.cos(3*(std_sorted[:,1] - 0.04 - 100*std_sorted[:,2]**2))**10
fig, ax = plt.subplots(ncols=2)
# im = ax[0].scatter(std_sorted[:, 1], std_sorted[:, 2], s=20, c=std_sorted[:, 0], marker='|')
im = ax[0].scatter(std_sorted[:, 1], std_sorted[:, 2], s=5, c=std_sorted[:, 0], marker='.')
ax[0].set_xlim(xmin, xmax)
ax[0].set_ylim(ymin, ymax)
ax[0].set_title("scatter plot")
ax[1].tricontourf(std_sorted[:, 1], std_sorted[:, 2], std_sorted[:, 0], 256)
ax[1].set_title("tricontourf")
plt.tight_layout()
plt.show()