Вот способ создать похожий график из данных, подобных вашим. Обратите внимание, что у вас есть значения около 30, в то время как ваш примерный график имеет значения в диапазоне 0,1 - 2,1.
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
M, N = 24, 15
df = pd.DataFrame({'X': np.repeat(np.arange(M), N),
'Y': np.tile(np.arange(N), M),
'Val': 30 + np.random.normal(size=(M, N)).cumsum(axis=0).cumsum(axis=1).ravel() / 2})
fig, (ax1, ax2) = plt.subplots(ncols=2)
scat = ax1.scatter(df['X'], df['Y'], c=df['Val'], cmap='Spectral')
plt.colorbar(scat, ax=ax1)
ax1.set_title('just the values')
xs = df['X'].to_numpy().reshape(M, N)
ys = df['Y'].to_numpy().reshape(M, N)
vals = df['Val'].to_numpy().reshape(M, N)
contours = ax2.contour(xs, ys, vals, cmap='Spectral')
ax2.clabel(contours, inline=1, fmt='%.1f', fontsize=10)
plt.colorbar(contours, ax=ax2)
ax2.set_title('isolines')
plt.show()
The demo data are like:
X Y Val
0 0 0 30.505696
1 0 1 30.617889
2 0 2 30.585834
3 0 3 31.455314
4 0 4 30.897253
Итак, для каждого xy точка сетки есть измерение. На диаграмме рассеяния для каждого измерения отображается точка, цвет которой указывает его значение.
ax.contour()
создает контурные линии (или изолинии), соединяющие все точки, в которых, по оценкам, измерения имеют одинаковые стоимость. ax.clabel()
добавляет текстовые метки для отображения значения. В этом случае изолинии и текст имеют тот же цвет, что и диаграмма рассеяния, чтобы лучше видеть соответствие. Если вместо этого выбрать фиксированные цвета, будет получен график, аналогичный приведенному в примере.
Помимо ax.contour()
, которому требуется x и y на l ie на сетке, есть также ax.tricontour()
, где x и y могут быть расположены более свободно.