Python繪制散點密度圖的三種方式詳解

散點密度圖是在散點圖的基礎上,計算了每個散點周圍分布了多少其他的點,并通過顏色表現出來。本文主要介紹了Python繪制散點密度圖的三種方式,需要的可以參考下

方式一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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)
# 讀取數據
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("估計值",fontdict=font3)
plt.xlabel("預測值",fontdict=font3)
plt.savefig('F:/Rpython/lp37/plot70.png',dpi=800,bbox_inches='tight',pad_inches=0)
plt.show()

Python繪制散點密度圖的三種方式詳解-1文章源自四五設計網-http://www.133122.cn/39459.html

Python繪制散點密度圖的三種方式詳解-2文章源自四五設計網-http://www.133122.cn/39459.html

方式二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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為兩個需要做對比分析的兩個量。
????# ==========計算評價指標==========
????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('==========算法評價指標==========')
????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)????? # 預測與實測數據之間的回歸線
????plt.axis([0,25,0,25])? # 設置線的范圍
????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的位置需要根據x,y的大小范圍進行調整。
????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)????????????????????????????????? # 設置x坐標軸的顯示范圍
????plt.ylim(0,25)????????????????????????????????? # 設置y坐標軸的顯示范圍
????plt.savefig('F:/Rpython/lp37/plot71.png',dpi=800,bbox_inches='tight',pad_inches=0)
????plt.show()

Python繪制散點密度圖的三種方式詳解-3文章源自四五設計網-http://www.133122.cn/39459.html

方式三

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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)
# 讀取數據
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()

Python繪制散點密度圖的三種方式詳解-4文章源自四五設計網-http://www.133122.cn/39459.html

Python繪制散點密度圖的三種方式詳解-5文章源自四五設計網-http://www.133122.cn/39459.html

Python繪制散點密度圖的三種方式詳解-6文章源自四五設計網-http://www.133122.cn/39459.html

到此這篇關于Python繪制散點密度圖的三種方式詳解的文章就介紹到這了文章源自四五設計網-http://www.133122.cn/39459.html 文章源自四五設計網-http://www.133122.cn/39459.html

繼續閱讀
我的微信
微信掃一掃
weinxin
我的微信
惠生活福利社
微信掃一掃
weinxin
我的公眾號
 
  • 本文由 四五設計網小助手 發表于 2024年2月1日10:03:59
  • 轉載請務必保留本文鏈接:http://www.133122.cn/39459.html

發表評論

匿名網友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

拖動滑塊以完成驗證