简体   繁体   中英

How to interpolate/display 2D data and invert 2D interpolations

I am dealing with a csv data set of the following structure:

https://i.stack.imgur.com/nLqiq.png

Ideally, I would like to find an interpolated function c = c(a, b) and then invert it, ie so that I can specify a value c and it will return a number or an array of numbers such that the interpolated functional form holds. With

 df = pd.read_csv('data.txt', sep=",", header=None)     
 plt.tricontourf(df.a.values, df.b.values, df.c.values, 50) 
 plt.plot(df.a.values, df.b.values, 'k+', markersize = 3, alpha=0.3, color='white')

I seem to get pretty close to some kind of interpolation (even though I don't understand how exactly this interpolation is computed):

在此处输入图像描述

However, from here I don't know how I can get the interpolated function (I also tried playing with interpol2D but no luck here either) an especially how to invert it from there. What would be the best way to do this? The data set I am using can be found here

You could call plt.tricontour(df.a.values, df.b.values, df.c.values, levels=[specific_c]) which draws curves corresponding to the specific c-value (or list of c-values). Optionally, you could extract these curves: extracting values from contour lines .

The way the contour algorithm probably works, is first dividing the points into triangles ( Delaunay triangulation ). For the filled contour, a color is assigned to each triangle vertex and these colors are interpolated ( Gouraud shading ). For the line contours, onto each triangle where the vertices are on different sides of the chosen c-value, interpolate the value on the triangle edges and connect them with lines.

Here is an illustrating example:

import numpy as np
import matplotlib.pyplot as plt

a = np.random.uniform(-1.5, 1.5, 5000)
b = np.random.uniform(-1.5, 1.5, 5000)
c = (a ** 2 + b ** 2 - 1) ** 3 - a ** 2 * b ** 3
fig, (ax1, ax2, ax3) = plt.subplots(ncols=3, figsize=(14, 4), sharex=True, sharey=True,
                                    gridspec_kw={'width_ratios': [5, 4, 4]})
cntf = ax1.tricontourf(a, b, c, levels=np.linspace(-2, 2, 101), cmap='RdYlGn')
plt.colorbar(cntf, ax=ax1)
cnt = ax2.tricontour(a, b, c, levels=[0], colors='crimson', linewidths=4)

verts = np.concatenate([p.vertices for p in cnt.collections[0].get_paths()])
ax3.scatter(verts[:, 0], verts[:, 1], s=1, c='turquoise')
plt.show()

图解情节

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM