Как построить контур для верхней треугольной матрицы в Matplotlib?
Я хочу добавить контурную диаграмму на моих данных для z= 0.35, на диаграмме рассеяния.
вот мои данные:
X Y Z
0.100 0.500 0.455
0.100 1.000 0.453
0.100 1.500 0.451
0.100 2.000 0.449
0.100 3.000 0.448
0.100 4.000 0.445
0.100 5.000 0.442
0.100 6.000 0.437
0.100 7.000 0.425
0.100 8.000 0.411
0.100 9.000 0.398
0.100 10.000 0.383
0.100 10.500 0.375
0.100 11.000 0.364
0.100 11.300 0.357
0.100 11.500 0.349
0.100 11.800 0.336
0.100 12.000 0.324
0.100 12.300 0.299
0.100 12.500 0.269
0.500 1.000 0.452
0.500 1.500 0.450
0.500 2.000 0.449
0.500 3.000 0.447
0.500 4.000 0.445
0.500 5.000 0.442
0.500 6.000 0.437
0.500 7.000 0.424
0.500 8.000 0.410
0.500 9.000 0.396
0.500 10.000 0.382
0.500 10.500 0.373
0.500 11.000 0.362
0.500 11.300 0.355
0.500 11.500 0.347
0.500 11.800 0.334
0.500 12.000 0.322
0.500 12.300 0.297
0.500 12.500 0.267
1.000 1.500 0.448
1.000 2.000 0.448
1.000 3.000 0.446
1.000 4.000 0.444
1.000 5.000 0.441
1.000 6.000 0.436
1.000 7.000 0.422
1.000 8.000 0.407
1.000 9.000 0.394
1.000 10.000 0.379
1.000 10.500 0.371
1.000 11.000 0.360
1.000 11.300 0.352
1.000 11.500 0.345
1.000 11.800 0.330
1.000 12.000 0.319
1.000 12.300 0.293
1.000 12.500 0.263
1.500 2.000 0.447
1.500 3.000 0.445
1.500 4.000 0.442
1.500 5.000 0.439
1.500 6.000 0.434
1.500 7.000 0.420
1.500 8.000 0.405
1.500 9.000 0.392
1.500 10.000 0.377
1.500 10.500 0.368
1.500 11.000 0.357
1.500 11.300 0.350
1.500 11.500 0.342
1.500 11.800 0.328
1.500 12.000 0.316
1.500 12.300 0.290
2.000 3.000 0.443
2.000 4.000 0.441
2.000 5.000 0.439
2.000 6.000 0.433
2.000 7.000 0.418
2.000 8.000 0.403
2.000 9.000 0.388
2.000 10.000 0.374
2.000 10.500 0.365
2.000 11.000 0.354
2.000 11.300 0.347
2.000 11.500 0.339
2.000 11.800 0.325
2.000 12.000 0.313
2.000 12.300 0.287
2.000 12.500 0.256
3.000 4.000 0.439
3.000 5.000 0.437
3.000 6.000 0.431
3.000 7.000 0.413
3.000 8.000 0.397
3.000 9.000 0.382
3.000 10.000 0.368
3.000 10.500 0.359
3.000 11.000 0.348
3.000 11.300 0.341
3.000 11.500 0.333
3.000 11.800 0.318
3.000 12.000 0.306
3.000 12.300 0.280
3.000 12.500 0.248
4.000 5.000 0.435
4.000 6.000 0.427
4.000 7.000 0.406
4.000 8.000 0.388
4.000 9.000 0.375
4.000 10.000 0.360
4.000 10.500 0.351
4.000 11.000 0.340
4.000 11.300 0.333
4.000 11.500 0.325
4.000 11.800 0.310
4.000 12.000 0.298
4.000 12.300 0.270
4.000 12.500 0.239
5.000 6.000 0.418
5.000 7.000 0.392
5.000 8.000 0.375
5.000 9.000 0.363
5.000 10.000 0.350
5.000 10.500 0.341
5.000 11.000 0.330
5.000 11.300 0.324
5.000 11.500 0.315
5.000 11.800 0.300
5.000 12.000 0.288
5.000 12.300 0.260
5.000 12.500 0.228
6.000 7.000 0.368
6.000 8.000 0.356
6.000 9.000 0.347
6.000 10.000 0.337
6.000 10.500 0.329
6.000 11.000 0.318
6.000 11.300 0.313
6.000 11.500 0.304
6.000 11.800 0.289
6.000 12.000 0.276
6.000 12.300 0.247
6.000 12.500 0.214
7.000 8.000 0.346
7.000 9.000 0.339
7.000 10.000 0.329
7.000 10.500 0.322
7.000 11.000 0.311
7.000 11.300 0.305
7.000 11.500 0.296
7.000 11.800 0.280
7.000 12.000 0.267
7.000 12.300 0.237
7.000 12.500 0.202
8.000 9.000 0.332
8.000 10.000 0.322
8.000 10.500 0.315
8.000 11.000 0.303
8.000 11.300 0.297
8.000 11.500 0.287
8.000 11.800 0.270
8.000 12.000 0.256
8.000 12.300 0.224
8.000 12.500 0.188
9.000 10.000 0.314
9.000 10.500 0.305
9.000 11.000 0.293
9.000 11.300 0.287
9.000 11.500 0.276
9.000 11.800 0.257
9.000 12.000 0.242
9.000 12.300 0.208
9.000 12.500 0.170
10.000 10.500 0.292
10.000 11.000 0.277
10.000 11.300 0.273
10.000 11.500 0.259
10.000 11.800 0.236
10.000 12.000 0.220
10.000 12.300 0.182
10.000 12.500 0.143
10.500 11.000 0.264
10.500 11.300 0.264
10.500 11.500 0.247
10.500 11.800 0.221
10.500 12.000 0.203
10.500 12.300 0.164
10.500 12.500 0.123
11.000 11.300 0.264
11.000 11.500 0.235
11.000 11.800 0.202
11.000 12.000 0.182
11.000 12.300 0.140
11.000 12.500 0.098
11.300 11.500 0.190
11.300 11.800 0.165
11.300 12.000 0.150
11.300 12.300 0.111
11.300 12.500 0.072
11.500 11.800 0.150
11.500 12.000 0.136
11.500 12.300 0.096
11.500 12.500 0.058
11.800 12.000 0.118
11.800 12.300 0.074
11.800 12.500 0.036
1 ответ
Решение
Мне было немного трудно интерпретировать ваш вопрос, но я думаю, что вы хотите одну линию контура, указывающую z=0.35
построены на точечной диаграмме. Для этого вам необходимо сначала интерполировать данные Z на обычную сетку XY (например, используя scipy.interpolate.griddata
). Затем вы можете построить контур интерполированных данных:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import griddata
# Read the input data
data = pd.read_csv("data.csv", names=("x", "y", "z"), delim_whitespace=True, header=0)
# Create interpolation grid
xi = np.linspace(data["x"].min(), data["x"].max(), 100)
yi = np.linspace(data["y"].min(), data["y"].max(), 100)
Xi, Yi = np.meshgrid(xi, yi)
points = np.array([data["x"], data["y"]]).T
outpoints = np.array([Xi, Yi]).T
# Interpolate z-values on grid
zi = griddata(points=points, values=data["z"], xi=outpoints, method="cubic")
# Plot contour line at z=0.35
CS = plt.contour(xi, yi, zi.T, levels=[0.35], colors="k")
plt.clabel(CS)
# Plot scatter on top of contour
plt.scatter(data["x"], data["y"], c=data["z"], cmap="Blues", s=5)
plt.colorbar()
plt.show()
Результат: