優點

接下來作者將展示如何用python代碼復現這個可視化,以及怎么樣改進使其更美觀

代碼實現

數據生成

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings("ignore")

# 示例數據集
df = pd.DataFrame(np.random.randn(100, 10), columns=["M", "V", "D", "t", "w", "n", "fy", "fc", "L", "d"])
df.head()

生成一個具有10列隨機數(遵循標準正態分布)的示例數據集,并將其列名設置為[“M”, “V”, “D”, “t”, “w”, “n”, “fy”, “fc”, “L”, “d”]

基礎復現

# 計算皮爾遜相關系數矩陣
corr = df.corr()

# 創建 PairGrid
g = sns.PairGrid(df)

# 左下角繪制散點圖
g.map_lower(sns.scatterplot)

# 對角線繪制直方圖
g.map_diag(sns.histplot, kde=True)

# 右上角顯示相關系數
for i, j in zip(*np.triu_indices_from(corr, 1)):
g.axes[i, j].annotate(f'corr:{corr.iloc[i, j]:.2f}', (0.5, 0.5),
textcoords='axes fraction', ha='center', va='center', fontsize=20)

plt.savefig("第一種.pdf", format='pdf', bbox_inches='tight')
plt.show()

創建一個綜合圖表,用于展示數據集中多個變量之間的分布和線性關系,左下角部分是散點圖,對角線部分是直方圖與核密度估計,而右上角則顯示每對變量的皮爾遜相關系數

改進——修改相關系數部分為熱圖

corr = df.corr()
g = sns.PairGrid(df)
g.map_lower(sns.scatterplot)
g.map_diag(sns.histplot, kde=True)
fig = g.fig

# 右上角替換為熱力圖(每個子圖顯示一個相關系數)
for i, j in zip(*np.triu_indices_from(corr, 1)):
ax = g.axes[i, j]
sns.heatmap(pd.DataFrame([[corr.iloc[i, j]]]), cmap=sns.diverging_palette(240, 10, as_cmap=True),
cbar=False, annot=True, fmt=".2f", square=True, ax=ax, vmin=-1, vmax=1,
annot_kws={"size": 20}) # 設置相關系數數字字體大小為12

# 在圖形旁邊添加全局色條
fig.subplots_adjust(right=0.85) # 調整圖形右側空間以顯示色條
cbar_ax = fig.add_axes([0.87, 0.15, 0.03, 0.7]) # 定義色條位置和大小
norm = plt.Normalize(vmin=-1, vmax=1)
sm = plt.cm.ScalarMappable(cmap=sns.diverging_palette(240, 10, as_cmap=True), norm=norm)
sm.set_array([]) # 為空數組設置色條
fig.colorbar(sm, cax=cbar_ax) # 添加全局色條
plt.savefig("第二種.pdf", format='pdf', bbox_inches='tight')
plt.show()

通過使用熱力圖替代右上角的空白數字顯示、添加全局色條以及調整圖形布局,確實使相關系數矩陣的展示更加直觀和信息豐富。然而,細心的讀者會發現,這種方法會導致除第一列以外的其他列的散點圖和直方圖顯示不完整,因此,需要進一步優化,而不是簡單地通過函數批量繪制散點圖和直方圖

corr = df.corr()
n = len(df.columns)
fig, axes = plt.subplots(n, n, figsize=(2.5 * n, 2.5 * n))

# 繪制每個位置的散點圖和直方圖
for i in range(n):
for j in range(n):
ax = axes[i, j]
if i == j:
# 對角線:繪制直方圖
sns.histplot(df.iloc[:, i], kde=True, ax=ax)
elif i > j:
# 下三角:繪制散點圖
sns.scatterplot(x=df.iloc[:, j], y=df.iloc[:, i], ax=ax)
else:
# 上三角:繪制熱圖顯示相關系數
sns.heatmap(pd.DataFrame([[corr.iloc[i, j]]]), cmap=sns.diverging_palette(240, 10, as_cmap=True),
cbar=False, annot=True, fmt=".2f", square=True, ax=ax, vmin=-1, vmax=1,
annot_kws={"size": 20}) # 設置相關系數數字字體大小

# 隱藏不需要的軸標簽
if i < n - 1:
ax.set_xticklabels([])
if j > 0:
ax.set_yticklabels([])

# 調整子圖之間的間距
plt.subplots_adjust(hspace=0.3, wspace=0.3)

# 在圖形旁邊添加全局色條
fig.subplots_adjust(right=0.85) # 調整圖形右側空間以顯示色條
cbar_ax = fig.add_axes([0.87, 0.15, 0.03, 0.7]) # 定義色條位置和大小
norm = plt.Normalize(vmin=-1, vmax=1)
sm = plt.cm.ScalarMappable(cmap=sns.diverging_palette(240, 10, as_cmap=True), norm=norm)
sm.set_array([]) # 為空數組設置色條
fig.colorbar(sm, cax=cbar_ax) # 添加全局色條

plt.savefig("改進后的可視化.pdf", format='pdf', bbox_inches='tight')
plt.show()

通過手動控制每個子圖的類型和位置,解決原方法中圖像顯示不完整的問題,最后隱藏不必要的軸標簽,減少視覺冗余,使圖表更加簡潔和清晰

當然讀者可以通過進一步優化圖表元素,如調整核密度曲線的顏色、樣式以及圖例顯示等,來探索更豐富的可視化效果和數據洞察

文章轉自微信公眾號@Python機器學習AI

上一篇:

樹模型系列:如何通過XGBoost提取特征貢獻度

下一篇:

復現 Nature 圖表可視化——基于模型殘差分析與顯著性檢驗的模型解釋

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費