Как я могу наложить градиентное поле на 2D тепловую карту, созданную из CSV-файла в Python? - PullRequest
0 голосов
/ 27 октября 2019

У меня есть тепловая карта, сгенерированная из файла CSV, как показано ниже: введите описание изображения здесь

Теперь мне нужно наложить поле градиента на это. Я пытался с numpy.gradient, но он не работает идеально. Вот код Python, который я пробовал.

import csv
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns



data_path = 'sed2.csv' # this is a two dimensional array with 51 row and 47 columns
with open(data_path, 'r') as f:
    reader = csv.reader(f, delimiter=',')
    # get header from first row
    headers = next(reader)
    # get all the rows as a list
    data = list(reader)
    # transform data into numpy array
    data = np.array(data).astype(float)

#print(headers)
#print(data.shape)
#print(data[:,1:47])
[gx,gy]=np.gradient(np.array(data[:,1:47], dtype=float)) # here I calculated the gradient from a 51x47 matrix 


plt.rcParams['font.size'] = 30
df=pd.read_csv('n_vs_c_sed.csv') # this reads file with heading: n c sed

df_pivot=df.pivot('c', 'n', 'sed')
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(111)
sns.heatmap(df_pivot, cmap='RdGy',  annot=False,  square=True, cbar=True, xticklabels=15, yticklabels=10)
ax.set_yticklabels(ax.get_yticklabels(), rotation=0)

for _, spine in ax.spines.items():
    spine.set_visible(True)
    spine.set_linewidth(1.0)
plt.gca().invert_yaxis()
ax.set_aspect(aspect=.9)
plt.savefig('SED.png', dpi = 300, transparent = True, bbox_inches = 'tight', pad_inches = 0)
#plt.contour(df_pivot, 15, colors='black')
n = np.linspace(5,50,46)
c= np.linspace(0,.5,20)
X,Y = np.meshgrid(n,c)
plt.quiver(X,Y,gy,gx,width=.003,linewidth=1)
plt.show()

Результат, который я получил от этого, дан здесь , что не ожидается. Однако, если я запускаю только код для колчанового графика, как показано ниже:

import csv
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

fig = plt.figure(figsize=(10,10))
data_path = 'sed2.csv'
with open(data_path, 'r') as f:
    reader = csv.reader(f, delimiter=',')
    # get header from first row
    headers = next(reader)
    # get all the rows as a list
    data = list(reader)
    # transform data into numpy array
    data = np.array(data).astype(float)



   #print(headers)
#print(data.shape)
#print(data[:,1:47])
[gx,gy]=np.gradient(np.array(data[:,1:47], dtype=float))
dx = np.linspace(5,50,46)
dy= np.linspace(0,.5,20)
X,Y = np.meshgrid(dx,dy)
#u,v=np.meshgrid(gx,gy)
plt.quiver(X,Y,gy,gx,width=.002,linewidth=0.5)
plt.show()

Это дает график , подобный этому . Любые предложения будут оценены. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...