У меня есть тепловая карта, сгенерированная из файла 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()
Это дает график , подобный этому . Любые предложения будут оценены. Спасибо.