如何在 matplotlib 中绘制上三角矩阵的等高线?

how to plot a contour for upper triangular matrix in 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     

我有点难以解释你的问题,但我认为你想要在散点图上绘制一条指示 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()

结果: