2D контурный график в Python с использованием 1D переменных X, Y и Z

Aug 15 2020

Позвольте мне начать этот вопрос с признания того, что я новичок в Python. Я хочу создать контурный график данных в Python, чтобы автоматизировать процесс, который в противном случае можно было бы легко выполнить с помощью Surfer. У меня есть тысячи таких файлов данных, и создание вручную может быть очень утомительным. Данные, которые я использую, выглядят следующим образом: это фрейм данных с заголовками 0, 1 и 2 и 1,2, .. 279 в качестве индекса:

     0   1         2
0     3  -1 -0.010700
1     4  -1  0.040100
2     5  -1  0.061000
3     6  -1  0.052000
4     7  -1  0.013100
..   ..  ..       ...
275  30  -9 -1.530100
276  31  -9 -1.362300
277  32  -9 -1.190200
278  33  -9 -1.083600
279  30 -10 -1.864600

[280 rows x 3 columns]

Вот,

x=data[0]
y=data[1]
z=data[2]

Поскольку контурная функция pf matplotlib требует, чтобы z был двумерным массивом; здесь начинается путаница. Следуя нескольким решениям запросов stackoverflow, я сделал следующее:

import numpy as np
x=np.array(x)
y=np.array(y)
z=np.array(z)
X, Y = np.meshgrid(x, y)
import scipy.interpolate
rbf = scipy.interpolate.Rbf(x, y, z, function='cubic')
Z=rbf(X,Y)

lmin=data[2].min()
lmax=data[2].max()
progn=(lmax-lmin)/20
limit=np.arange(lmin,lmax,progn)

fig, ax = plt.subplots(figsize=(6,2)) #x ranges between 3 to 57, y -1 to -10
ax.contour(X,Y,Z,limit) 
ax.set_title('Contour Plot')
plt.show()

С помощью приведенного выше кода получается этот график.

Тем не менее, это нежелательно, и если однажды можно увидеть сквозь линии поверхностного шума, то внизу есть упорядоченные контурные линии, что на самом деле желательно, как видно из контурного графика, созданного серфером здесь.

Я хотел бы повторить, что те же данные использовались при построении графика серфера.

Приветствуем любую помощь в создании желаемого сюжета.

Ответы

ChandanDey Oct 07 2020 at 18:34

Спасибо @JohanC за ответ. Я хотел бы рассмотреть его предложение в контексте моего запроса.

ax.contourзаменен на ax.tricontourрешает мою ситуацию. И ax.tricontourfзавершает заливку контура. Следовательно, последний сегмент моего кода будет:

fig, ax = plt.subplots(figsize=(6,2)) #x ranges between 3 to 57, y -1 to -10
ax.tricontour(X,Y,Z,limit) 
ax.tricontourf(X,Y,Z,limit) 
ax.set_title('Contour Plot')
plt.show()