Python繪制散點(diǎn)密度圖的三種方式詳解
方式一
import matplotlib.pyplot as plt import numpy as np from scipy.stats import gaussian_kde from mpl_toolkits.axes_grid1 import make_axes_locatable from matplotlib import rcParams config = {"font.family":'Times New Roman',"font.size": 16,"mathtext.fontset":'stix'} rcParams.update(config) # 讀取數(shù)據(jù) import pandas as pd filename=r'F:/Rpython/lp37/testdata.xlsx' df2=pd.read_excel(filename)#讀取文件 x=df2['data1'].values y=df2['data2'].values xy = np.vstack([x,y]) z = gaussian_kde(xy)(xy) idx = z.argsort() x, y, z = x[idx], y[idx], z[idx] fig,ax=plt.subplots(figsize=(12,9),dpi=100) scatter=ax.scatter(x,y,marker='o',c=z,edgecolors='',s=15,label='LST',cmap='Spectral_r') cbar=plt.colorbar(scatter,shrink=1,orientation='vertical',extend='both',pad=0.015,aspect=30,label='frequency') #orientation='horizontal' font3={'family':'SimHei','size':16,'color':'k'} plt.ylabel("估計(jì)值",fontdict=font3) plt.xlabel("預(yù)測(cè)值",fontdict=font3) plt.savefig('F:/Rpython/lp37/plot70.png',dpi=800,bbox_inches='tight',pad_inches=0) plt.show()
方式二
from statistics import mean import matplotlib.pyplot as plt from sklearn.metrics import explained_variance_score,r2_score,median_absolute_error,mean_squared_error,mean_absolute_error from scipy import stats import numpy as np from matplotlib import rcParams config = {"font.family":'Times New Roman',"font.size": 16,"mathtext.fontset":'stix'} rcParams.update(config) def scatter_out_1(x,y): ## x,y為兩個(gè)需要做對(duì)比分析的兩個(gè)量。 # ==========計(jì)算評(píng)價(jià)指標(biāo)========== BIAS = mean(x - y) MSE = mean_squared_error(x, y) RMSE = np.power(MSE, 0.5) R2 = r2_score(x, y) MAE = mean_absolute_error(x, y) EV = explained_variance_score(x, y) print('==========算法評(píng)價(jià)指標(biāo)==========') print('BIAS:', '%.3f' % (BIAS)) print('Explained Variance(EV):', '%.3f' % (EV)) print('Mean Absolute Error(MAE):', '%.3f' % (MAE)) print('Mean squared error(MSE):', '%.3f' % (MSE)) print('Root Mean Squard Error(RMSE):', '%.3f' % (RMSE)) print('R_squared:', '%.3f' % (R2)) # ===========Calculate the point density========== xy = np.vstack([x, y]) z = stats.gaussian_kde(xy)(xy) # ===========Sort the points by density, so that the densest points are plotted last=========== idx = z.argsort() x, y, z = x[idx], y[idx], z[idx] def best_fit_slope_and_intercept(xs, ys): m = (((mean(xs) * mean(ys)) - mean(xs * ys)) / ((mean(xs) * mean(xs)) - mean(xs * xs))) b = mean(ys) - m * mean(xs) return m, b m, b = best_fit_slope_and_intercept(x, y) regression_line = [] for a in x: regression_line.append((m * a) + b) fig,ax=plt.subplots(figsize=(12,9),dpi=600) scatter=ax.scatter(x,y,marker='o',c=z*100,edgecolors='',s=15,label='LST',cmap='Spectral_r') cbar=plt.colorbar(scatter,shrink=1,orientation='vertical',extend='both',pad=0.015,aspect=30,label='frequency') plt.plot([0,25],[0,25],'black',lw=1.5) # 畫的1:1線,線的顏色為black,線寬為0.8 plt.plot(x,regression_line,'red',lw=1.5) # 預(yù)測(cè)與實(shí)測(cè)數(shù)據(jù)之間的回歸線 plt.axis([0,25,0,25]) # 設(shè)置線的范圍 plt.xlabel('OBS',family = 'Times New Roman') plt.ylabel('PRE',family = 'Times New Roman') plt.xticks(fontproperties='Times New Roman') plt.yticks(fontproperties='Times New Roman') plt.text(1,24, '$N=%.f$' % len(y), family = 'Times New Roman') # text的位置需要根據(jù)x,y的大小范圍進(jìn)行調(diào)整。 plt.text(1,23, '$R^2=%.3f$' % R2, family = 'Times New Roman') plt.text(1,22, '$BIAS=%.4f$' % BIAS, family = 'Times New Roman') plt.text(1,21, '$RMSE=%.3f$' % RMSE, family = 'Times New Roman') plt.xlim(0,25) # 設(shè)置x坐標(biāo)軸的顯示范圍 plt.ylim(0,25) # 設(shè)置y坐標(biāo)軸的顯示范圍 plt.savefig('F:/Rpython/lp37/plot71.png',dpi=800,bbox_inches='tight',pad_inches=0) plt.show()
方式三
import pandas as pd import numpy as np from scipy import optimize import matplotlib.pyplot as plt from matplotlib import cm from matplotlib.colors import Normalize from scipy.stats import gaussian_kde from matplotlib import rcParams config={"font.family":'Times New Roman',"font.size":16,"mathtext.fontset":'stix'} rcParams.update(config) # 讀取數(shù)據(jù) filename=r'F:/Rpython/lp37/testdata.xlsx' df2=pd.read_excel(filename)#讀取文件 x=df2['data1'].values.ravel() y=df2['data2'].values.ravel() N = len(df2['data1']) #繪制擬合線 x2 = np.linspace(-10,30) y2 = x2 def f_1(x,A,B): return A*x + B A1,B1 = optimize.curve_fit(f_1,x,y)[0] y3 = A1*x + B1 # Calculate the point density xy = np.vstack([x,y]) z = gaussian_kde(xy)(xy) norm = Normalize(vmin = np.min(z), vmax = np.max(z)) #開始繪圖 fig,ax=plt.subplots(figsize=(12,9),dpi=600) scatter=ax.scatter(x,y,marker='o',c=z*100,edgecolors='',s=15,label='LST',cmap='Spectral_r') cbar=plt.colorbar(scatter,shrink=1,orientation='vertical',extend='both',pad=0.015,aspect=30,label='frequency') cbar.ax.locator_params(nbins=8) cbar.ax.set_yticklabels([0.005,0.010,0.015,0.020,0.025,0.030,0.035])#0,0.005,0.010,0.015,0.020,0.025,0.030,0.035 ax.plot(x2,y2,color='k',linewidth=1.5,linestyle='--') ax.plot(x,y3,color='r',linewidth=2,linestyle='-') fontdict1 = {"size":16,"color":"k",'family':'Times New Roman'} ax.set_xlabel("PRE",fontdict=fontdict1) ax.set_ylabel("OBS",fontdict=fontdict1) # ax.grid(True) ax.set_xlim((0,25)) ax.set_ylim((0,25)) ax.set_xticks(np.arange(0,25.1,step=5)) ax.set_yticks(np.arange(0,25.1,step=5)) plt.savefig('F:/Rpython/lp37/plot72.png',dpi=800,bbox_inches='tight',pad_inches=0) plt.show()
到此這篇關(guān)于Python繪制散點(diǎn)密度圖的三種方式詳解的文章就介紹到這了,更多相關(guān)Python散點(diǎn)密度圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python APScheduler執(zhí)行使用方法詳解
在本篇文章里小編給大家整理的是一篇關(guān)于Python APScheduler執(zhí)行使用方法的相關(guān)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-12-12Python PIL庫讀取設(shè)置圖像的像素內(nèi)容方法示例
這篇文章主要為大家介紹了使用Python PIL庫Image模塊中的getpixel和putpixel方法讀取設(shè)置圖像的像素內(nèi)容實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

自定義Django Form中choicefield下拉菜單選取數(shù)據(jù)庫內(nèi)容實(shí)例

python對(duì)視頻畫框標(biāo)記后保存的方法

python提效小工具之統(tǒng)計(jì)xmind用例數(shù)量(源碼)