[英]Plot multiple 2D gradient Data sets with colorbar. Problem: Python plots mutiple colorbar
我正在做一些項目,我想比較我正在求解的某個方程的兩個不同解。 我有一些時間和空間(x,y)相關的數據。 這意味着我對於每個時間步 T 都有一個數據文件 T.dat,其中包含我正在求解的方程的 xy 和 Z 值。 當我 plot 方程的解單獨一切正常。 一旦我嘗試創建一個循環來迭代一些時間步驟,我就會遇到我的顏色條在第二次迭代中沒有被刪除的問題。 對於第一個 Plot,它工作正常,但在第二個之后,顏色條繼續在 plot 中累加。
這就是它的樣子。
經過四次迭代
這是我的代碼示例。 首先我導入了我的庫。
import numpy as np
import glob
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import animation
import scipy as sp
from IPython.display import set_matplotlib_formats
set_matplotlib_formats('jpg')
from mpl_toolkits.mplot3d import Axes3D
#%matplotlib qt
import animatplot as amp
from sklearn.preprocessing import StandardScaler
其次,我開始在 Dataframes 中導入我的數據(一些細節是我的更改,但它與我的問題無關)(請注意,路徑幾乎都是相同的,因為我想先測試 plot function。如果可行,我將把數據為了它 )
path_nonoise = r'Thesis/NCKSM/FieldData/'
path_noise_additive = r'Thesis/NCKSM/FieldData/'
path_noise_multiplicative = r'Thesis/NCKSM/FieldData/'
path_params_nonoise = r'Thesis/NCKSM/ParameterData/'
path_params_additive = r'Thesis/NCKSM/ParameterData/'
path_params_multiplicative= r'Thesis/NCKSM/ParameterData/'
all_files = len( sorted (glob.glob(path_nonoise + "/*.dat"))) #patern for the files
params_nonoise= pd.read_table(path_params_nonoise+'0'+'.dat',sep=':',names=['Params', 'Value',] )
params_Names_nonoise= np.asarray(params_nonoise['Params'].values.tolist())
params_Values_nonoise= np.asarray(params_nonoise['Value'].values.tolist())
quantum= int(params_Values_nonoise[3])
numberofdatas = np.arange(0,all_files)
#creat a list of the names
timesteps = np.arange(0,all_files*quantum,quantum )
nameofdata = [str(timesteps) for timesteps in timesteps]
# use your path
dfs_nonoise=[]
dfs_noise_additive=[]
dfs_noise_multiplicative=[]
for filename in nameofdata:
foo1=pd.read_table(path_nonoise+filename+'.dat',sep='\s+',names=['X', 'Y','C','Rho'] )
foo2=pd.read_table(path_noise_additive+filename+'.dat',sep='\s+',names=['X', 'Y','C','Rho'] )
foo3=pd.read_table(path_noise_multiplicative+filename+'.dat',sep='\s+',names=['X', 'Y','C','Rho'] )
dfs_nonoise.append(foo1)
dfs_noise_additive.append(foo2)
dfs_noise_multiplicative.append(foo3)
到目前為止,一切都很好。 現在這是我如何定義我的 Ploting function ,這就是我認為問題開始發生的地方。 我認為我的問題在於我如何在 function 中定義我的顏色條。
def plotgradient(fig,ax,X,Y,Z ,title ):
nbins= params_Values_nonoise[1] #this creats the gridpoints
X_0= np.asarray(X.values.tolist())
Y_0= np.asarray(Y.values.tolist())
xi, yi = np.mgrid[X_0.min():X_0.max():nbins*1j, Y_0.min():Y_0.max():nbins*1j] #rearange the arrays
zi = np.asarray(Z.values.tolist()) #datas you need
t= ax.pcolormesh(xi, yi, zi.reshape(xi.shape), cmap='jet') #plottingfunction
CS=ax.contour(xi, yi, zi.reshape(xi.shape) )
ax.clabel(CS, inline=1, fontsize=10)
colorbar=plt.colorbar(t, ax=ax, shrink=0.5, aspect=5) # colorbar
ax.set_xlabel('x') #labels
ax.set_ylabel('y')
ax.set_title(title) #title
ax.grid()
現在,如果我想 plot 我的數據就是我所做的。 我剛做了一個for循環。
Fig, axes = plt.subplots(ncols=2,nrows=1,figsize=(20,15))
my_path=r'/home/belkadi/Thesis/Plots/Plots27.01/additiveandnonoise/'
Ax1,Ax2=axes.flatten()
test=[0,1,2,3,4,5]
for i,j in zip(test,nameofdata[0:5]):
f1=plotgradient(Fig, Ax1,dfs_nonoise[i]['X'],dfs_nonoise[i]['Y'], dfs_nonoise[i]['Rho'],'Density Gradient without noise' )
f2=plotgradient(Fig, Ax2,dfs_nonoise[i]['X'],dfs_nonoise[i]['Y'], dfs_nonoise[i]['Rho'],'Density with noise' )
plt.savefig(my_path+j+".png")
所以。 我試圖在循環結束時使用 plt.clf() Fig.clf() plt.close() 。 My idea was that Python doesn't delete the previous colourbar and thats why I tried to tell python he should clear clear the figure after every plot what it does is that i just delets the figure completly and i get two blank plot. 像這樣 [plt.clf() 之后的繪圖] 然后我想也許我可以用 Ax1.cla() 清除軸,這也不起作用。
在此先感謝您的幫助。 我為我的物理學家意大利面條代碼道歉。
問候齊諾
我解決了我的問題。
基本上問題在於我如何定義我的 Plot function。
def plotgradient_double(fig,ax1,ax2,X,Y,Z1,Z2 ,title1, title2 ):
nbins= params_Values[1] #this creats t'he gridpoints
axes= [ax1,ax2]
xi, yi = np.mgrid[X.values.min():X.values.max():nbins*1j, Y.values.min():Y.values.max():nbins*1j] #rearange the arrays
#datas you need
t1= ax1.pcolormesh(xi, yi, Z1.values.reshape(int(nbins),int(nbins)), cmap='jet',vmax=1.)
t2= ax2.pcolormesh(xi, yi, Z2.values.reshape(int(nbins),int(nbins)), cmap='jet',vmin=0,vmax=1. ) #plottingfunction
#CS1=ax1.contour(xi, yi, Z1.values.reshape(int(nbins),int(nbins)) )
#CS2=ax2.contour(xi, yi, Z2.values.reshape(int(nbins),int(nbins)) )
#ax1.clabel(CS1, inline=1, fontsize=10)
#ax2.clabel(CS2, inline=1, fontsize=10)
#colorbar=fig.colorbar(T, ax=axc, shrink=0.5, aspect=5)
for ax in axes:
ax.set_xlabel('x',fontsize=15) #labels
ax.set_ylabel('y',fontsize=15)
#title
#ax.grid()
ax1.set_title(title1,fontsize=15)
ax2.set_title(title2,fontsize=15)
return t1,t2
之后,我可以在 for 循環中為 plot 多個數據創建一個顏色條,並在每次迭代后將其刪除。
使用colorbar.remove()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.