Matplotlib - Scatter Plot, Как заполнить пространство между каждой отдельной точкой? - PullRequest
0 голосов
/ 17 февраля 2020

Я строю следующие данные:

fig, ax = plt.subplots()
im = ax.scatter(std_sorted[:, [1]], std_sorted[:, [2]], s=5, c=std_sorted[:, [0]])

Со следующим результатом:

How the current scatter plot looks like

Мой вопрос: могу ли я заполнить пространство между каждым указать точку на графике путем экстраполяции, а затем соответствующим образом раскрасить экстраполированное пространство, чтобы я получил равномерный график без каких-либо точек?

Так что в основном я ищу этот результат (Это просто я "сжимаю" вышеприведенную картинку чтобы показать желаемый результат и не имея дело с пробелом между точками):

This is simply me

1 Ответ

1 голос
/ 17 февраля 2020

Самое простое, что можно сделать в этом случае, это использовать короткую вертикальную линию маркера и установить размер маркера достаточно большим, чтобы не осталось пустого пространства.

Другим вариантом является использование 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()

sample plot

...