折線圖(plot)
繪圖庫介紹
Python中繪制折線圖的全面指南_python繪制折線圖-CSDN博客https://blog.csdn.net/2301_81064905/article/details/139689644
核心作用 | 說明 |
---|---|
趨勢分析 | 揭示數據隨時間推移的上升/下降趨勢、周期性波動或轉折點 |
變化對比 | 在單一圖表中對比多個變量(如不同產品銷量)的變化軌跡 |
異常檢測 | 快速識別數據中的突變點(如系統故障、市場異動) |
連續性表達 | 強調數據在連續維度(時間、順序)上的演變過程 |
預測參考 | 基于歷史趨勢推斷未來走向(需結合統計模型) |
場景分類 | 具體案例 | 圖表特點 |
---|---|---|
時間序列分析 | ? 股票價格波動 ? 月度銷售額變化 ? 年度氣溫趨勢 | X軸為時間單位 Y軸為連續數值 |
性能監控 | ? 服務器CPU使用率 ? 網站日活用戶數 ? 應用程序響應延遲 | 常需實時更新 突出異常閾值 |
科學實驗 | ? 化學試劑濃度變化 ? 物理實驗測量值 ? 生物種群數量追蹤 | 強調變量間關系 需誤差線輔助 |
商業決策 | ? 不同渠道獲客成本對比 ? 產品迭代的用戶留存率 ? 營銷活動ROI趨勢 | 多線對比 標注關鍵節點 |
健康管理 | ? 患者體溫監測 ? 運動心率變化 ? 血糖水平記錄 | 個人數據跟蹤 關聯事件標記 |
?基礎參數(Underlying Parameter)
plt.plot(x, y, fmt, **kwargs)
#或者
ax.plot(x, y, fmt, **kwargs)
參數 | 描述 | 示例 |
---|---|---|
x | X軸數據 (可迭代對象) | [1, 2, 3, 4] |
y | Y軸數據 (可迭代對象) | [5, 3, 8, 2] |
fmt | 格式字符串 (顏色-標記-線型) | 'ro--' ?(紅色圓圈虛線) |
顏色 (Color)
代碼 | 顏色 | 示例 |
---|---|---|
'b' | 藍色 | 'b' |
'g' | 綠色 | 'g' |
'r' | 紅色 | 'r' |
'c' | 青色 | 'c' |
'm' | 品紅 | 'm' |
'y' | 黃色 | 'y' |
'k' | 黑色 | 'k' |
'w' | 白色 | 'w' |
?標記 (Marker)
代碼 | 標記 | 示例 |
---|---|---|
'.' | 點 | '.' |
'o' | 圓圈 | 'o' |
's' | 正方形 | 's' |
'D' | 菱形 | 'D' |
'^' | 上三角 | '^' |
'v' | 下三角 | 'v' |
'+' | 加號 | '+' |
'x' | 叉號 | 'x' |
'*' | 星號 | '*' |
線型 (Linestyle)
代碼 | 線型 | 示例 |
---|---|---|
'-' | 實線 | '-' |
'--' | 虛線 | '--' |
'-.' | 點劃線 | '.-' |
':' | 點線 | ':' |
?如果想實現更加精細的控制可以用下述的參數。
線條控制(Line Control)
-
color
?/?c
: 線條顏色 (名稱或十六進制) -
linestyle
?/?ls
: 線型樣式 -
linewidth
?/?lw
: 線寬 (浮點數) -
alpha
: 透明度 (0-1)
標記控制(Mark Control)
-
marker
: 標記樣式 -
markersize
?/?ms
: 標記大小 -
markeredgecolor
?/?mec
: 標記邊緣顏色 -
markerfacecolor
?/?mfc
: 標記填充顏色
其他控制(Other Controls)
-
label
: 圖例標簽 -
visible
: 是否顯示 (True/False) -
zorder
: 繪圖順序 (數值越大越靠前)
特殊參數(Special Parameters)
-
data
: 指定數據來源對象 (如DataFrame) -
scalex
,?scaley
: 是否自動縮放坐標軸 (默認為True)
返回值(Returned Value)
plot()
?函數返回一個包含?Line2D
?對象的列表,每個對象代表繪制的一條線。這些對象可用于后續的圖形操作。
示例代碼
import matplotlib.pyplot as plt
import numpy as np# 設置中文顯示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號# 創建數據
months = ['1月', '2月', '3月', '4月', '5月', '6月','7月', '8月', '9月', '10月', '11月', '12月']
sales = [85, 70, 92, 88, 78, 95, 105, 112, 98, 120, 135, 150]# 創建圖表和坐標軸
fig, ax = plt.subplots(figsize=(12, 8)) # 增加高度以容納表格# 繪制折線圖
line, = ax.plot(months, sales, marker='o', linestyle='-', color='#1f77b4',linewidth=2, markersize=8, label='月銷售額')# 添加數據點標簽
for i, (m, s) in enumerate(zip(months, sales)):ax.annotate(f'{s}萬', # 標簽文本xy=(i, s), # 數據點位置xytext=(0, 10), # 文本位置偏移量textcoords='offset points',ha='center', # 水平居中fontsize=9,color='dimgray')# 添加最高點注解
max_index = sales.index(max(sales))
ax.annotate('年度最高銷售額',xy=(max_index, sales[max_index]),xytext=(max_index-1, sales[max_index]-20),arrowprops=dict(arrowstyle='->', color='red', connectionstyle="arc3"),fontsize=10,bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="red", alpha=0.8),color='red')# 添加趨勢線(線性回歸)
x = np.arange(len(months))
fit = np.polyfit(x, sales, 1)
trend_line = np.polyval(fit, x)
ax.plot(months, trend_line, 'r--', label='銷售趨勢')# 添加標題和標簽
ax.set_title('2023年公司月度銷售額分析', fontsize=16, pad=20)
ax.set_xlabel('月份', fontsize=12, labelpad=10)
ax.set_ylabel('銷售額 (萬元)', fontsize=12, labelpad=10)# 設置網格線
ax.grid(True, linestyle='--', alpha=0.7)# 設置Y軸范圍
ax.set_ylim(60, 160)# 添加圖例
ax.legend(loc='upper left', frameon=True, shadow=True)# 修正后的數據表格 - 使用更合理的布局
# 準備表格數據
table_data = [['月份'] + months,['銷售額(萬)'] + [str(s) for s in sales]
]# 創建表格
table = plt.table(cellText=table_data,cellLoc='center',loc='bottom',bbox=[0, -0.25, 1, 0.15] # 調整表格位置和大小
)# 設置表格樣式
table.auto_set_font_size(False)
table.set_fontsize(10)
table.scale(1, 1.5) # 增加行高# 設置表頭樣式
for i in range(2):table[(0, i)].set_facecolor('#f0f0f0')table[(0, i)].set_text_props(weight='bold')# 設置最高值單元格樣式
table[(1, max_index+1)].set_facecolor('#ffdddd')
table[(1, max_index+1)].set_text_props(color='red', weight='bold')# 調整布局
plt.subplots_adjust(bottom=0.2) # 為表格留出適當空間# 添加腳注
plt.figtext(0.5, 0.01, '數據來源: 公司財務部 | 制圖日期: 2023-12-31 | 單位: 萬元',ha='center', fontsize=9, color='gray')
# 保存圖表為圖片
plt.savefig('line_chart.png',dpi=300,bbox_inches='tight',facecolor='white', # 設置背景色edgecolor='none' # 去除邊框
)# 顯示圖表
plt.show()
散點圖(scatter)
繪圖庫介紹
建筑兔零基礎自學python記錄8|學畫散點圖/Scatter plot-CSDN博客https://blog.csdn.net/tzcnancy/article/details/145395941
核心作用 | 說明 |
---|---|
相關性分析 | 直觀展示變量間的正相關/負相關/無相關關系 |
分布模式識別 | 發現數據聚類、離群點或非線性模式 |
異常值檢測 | 快速定位偏離主體分布的異常數據點 |
變量關系探索 | 為回歸分析、聚類等建模提供前期洞察 |
多維數據映射 | 通過顏色/大小添加第三、第四維度信息 |
場景分類 | 具體案例 | 圖表特點 |
---|---|---|
科學研究 | ? 身高與體重的關系 ? 藥物劑量與療效關聯 ? 基因表達相關性 | 常配合回歸線 使用顏色區分實驗組 |
商業分析 | ? 廣告投入與銷售額 ? 用戶年齡與消費金額 ? 產品特性偏好 | 氣泡大小表示交易量 多組數據對比 |
金融風控 | ? 收入與信用評分 ? 交易頻率與金額 ? 欺詐行為識別 | 突出異常點 劃分風險區域 |
工業制造 | ? 溫度與產品良率 ? 壓力與材料強度 ? 設備參數優化 | 標注控制邊界 顯示誤差范圍 |
地理信息 | ? 城市人口與GDP ? 氣候站溫濕度分布 ? 疫情傳播熱點 | 結合地圖坐標 熱力圖疊加 |
?函數簽名(Function Signature)
plt.scatter(x, y, # 必需:點的坐標s=None, # 點的大小c=None, # 點的顏色marker=None, # 點的形狀cmap=None, # 顏色映射norm=None, # 顏色歸一化vmin=None, vmax=None, # 顏色范圍限制alpha=None, # 透明度linewidths=None, # 邊緣線寬edgecolors=None, # 邊緣顏色plotnonfinite=False, # 是否繪制非有限值data=None, # 數據源**kwargs # 其他屬性
)
必需參數(Required Parameter)
參數 | 類型 | 說明 |
---|---|---|
x, y | array-like | 點的 x 和 y 坐標數據(長度必須相同) |
?主要可選參數(Main Selectable Parameters)
參數 | 類型 | 默認值 | 說明 |
---|---|---|---|
s | scalar or array | None ?(20) | 點的大小(以點為單位,是面積的平方) |
c | color or array | None ?('b') | 點的顏色(單一顏色或數值數組) |
marker | str | 'o' | 點的形狀('o' ,?'s' ,?'^' ,?'D' ?等) |
alpha | scalar | None | 透明度(0-1,0完全透明) |
linewidths | scalar or array | None ?(1.5) | 點邊緣的線寬 |
edgecolors | color or array | 'face' | 點邊緣的顏色('face' 表示與填充色相同) |
顏色映射參數(Color Mapping Parameters)
參數 | 說明 |
---|---|
cmap | 顏色映射對象或名稱(如?'viridis' ,?'jet' ,?'coolwarm' ) |
norm | 歸一化對象(用于將數值映射到 [0,1] 區間) |
vmin, vmax | 與?norm ?結合使用,定義顏色映射的數據范圍 |
其他參數(Other Parameters)
參數 | 說明 |
---|---|
plotnonfinite | 是否繪制 NaN 或 inf 值(默認 False) |
data | 數據源對象(可使用列名代替數據數組) |
label | 用于圖例的標簽 |
zorder | 繪圖順序(數值越大越靠上) |
示例代碼
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.font_manager as fm
from scipy.stats import pearsonr# 在繪圖代碼前添加字體設置
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'SimHei', 'Arial'] # 優先使用支持符號的字體
plt.rcParams['axes.unicode_minus'] = False # 解決負號顯示問題# ==================== 解決中文顯示問題 ====================
# 方法1:嘗試使用系統自帶的中文字體
try:# Windows 系統常用中文字體路徑font_path = 'C:/Windows/Fonts/simhei.ttf' # 黑體# font_path = 'C:/Windows/Fonts/msyh.ttc' # 微軟雅黑chinese_font = fm.FontProperties(fname=font_path)plt.rcParams['font.family'] = 'sans-serif'font_entry = fm.findfont(fm.FontProperties(fname=font_path))plt.rcParams['font.sans-serif'] = [fm.get_font(font_entry).family_name]use_custom_font = True
except:# 方法2:嘗試使用Matplotlib內置的中文支持plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'KaiTi', 'FangSong', 'STXihei', 'sans-serif']plt.rcParams['axes.unicode_minus'] = False # 解決負號顯示問題use_custom_font = False# 方法3:如果上述方法都不行,使用英文標題
use_english = False # 設為True則使用英文標題# ==================== 創建模擬數據 ====================
# 設置隨機種子確保結果可復現
np.random.seed(42)# 生成數據點數量
n = 150# 創建正相關數據
positive_x = np.random.randn(n) * 2
positive_y = positive_x * 1.5 + np.random.randn(n) * 1.5# 創建負相關數據
negative_x = np.random.randn(n) * 2 + 8
negative_y = negative_x * (-1.2) + np.random.randn(n) * 1.8 + 15# 創建無相關數據
random_x = np.random.randn(n) * 2 + 4
random_y = np.random.randn(n) * 3 + 8# 組合所有數據
all_x = np.concatenate([positive_x.ravel(), negative_x.ravel(), random_x.ravel()])
all_y = np.concatenate([positive_y.ravel(), negative_y.ravel(), random_y.ravel()])
categories = np.array(['正相關'] * n + ['負相關'] * n + ['無相關'] * n)
sizes = np.abs(np.random.randn(3 * n) * 30 + 20) # 點的大小
colors = np.random.rand(3 * n) # 點的顏色值# ==================== 創建散點圖 ====================
plt.figure(figsize=(14, 10))# 繪制不同類別的散點
for i, category in enumerate(['正相關', '負相關', '無相關']):idx = categories == categoryplt.scatter(all_x[idx], all_y[idx],s=sizes[idx],c=colors[idx],alpha=0.7, # 透明度edgecolor='black', # 點邊緣顏色linewidths=0.5, # 點邊緣寬度label=category, # 圖例標簽cmap='viridis') # 顏色映射# ==================== 添加注解和裝飾 ====================# 添加標題和坐標軸標簽
if use_english or not use_custom_font:plt.title('Scatter Plot with Detailed Annotations', fontsize=18, pad=20)plt.xlabel('X Variable', fontsize=14)plt.ylabel('Y Variable', fontsize=14)
else:plt.title('帶詳細注解的散點圖示例', fontsize=18, pad=20)plt.xlabel('X 變量', fontsize=14)plt.ylabel('Y 變量', fontsize=14)# 添加網格線
plt.grid(True, linestyle='--', alpha=0.3)# 添加圖例
plt.legend(title='相關類型' if not use_english else 'Correlation Type',loc='upper right',frameon=True,shadow=True,fancybox=True)# 計算并顯示相關系數
corr_pos, _ = pearsonr(positive_x, positive_y)
corr_neg, _ = pearsonr(negative_x, negative_y)
corr_rand, _ = pearsonr(random_x, random_y)if use_english or not use_custom_font:plt.text(-7, 25, f'Positive Correlation: r = {corr_pos:.2f}',fontsize=12, bbox=dict(facecolor='white', alpha=0.8))plt.text(5, 25, f'Negative Correlation: r = {corr_neg:.2f}',fontsize=12, bbox=dict(facecolor='white', alpha=0.8))plt.text(0, -5, f'No Correlation: r = {corr_rand:.2f}',fontsize=12, bbox=dict(facecolor='white', alpha=0.8))# 添加解釋性文本plt.text(-7, 22, '? Points show clear upward trend\n? Strong positive relationship',fontsize=10, bbox=dict(facecolor='lightyellow', alpha=0.7))plt.text(5, 22, '? Points show clear downward trend\n? Strong negative relationship',fontsize=10, bbox=dict(facecolor='lightyellow', alpha=0.7))plt.text(0, -8, '? Points are randomly scattered\n? No discernible relationship',fontsize=10, bbox=dict(facecolor='lightyellow', alpha=0.7))
else:plt.text(-7, 25, f'正相關: r = {corr_pos:.2f}',fontsize=12, bbox=dict(facecolor='white', alpha=0.8))plt.text(5, 25, f'負相關: r = {corr_neg:.2f}',fontsize=12, bbox=dict(facecolor='white', alpha=0.8))plt.text(0, -5, f'無相關: r = {corr_rand:.2f}',fontsize=12, bbox=dict(facecolor='white', alpha=0.8))# 添加解釋性文本plt.text(-7, 22, '? 點呈現明顯上升趨勢\n? 強正相關關系',fontsize=10, bbox=dict(facecolor='lightyellow', alpha=0.7))plt.text(5, 22, '? 點呈現明顯下降趨勢\n? 強負相關關系',fontsize=10, bbox=dict(facecolor='lightyellow', alpha=0.7))plt.text(0, -8, '? 點隨機分布\n? 無明顯相關關系',fontsize=10, bbox=dict(facecolor='lightyellow', alpha=0.7))# 添加趨勢線
z_pos = np.polyfit(positive_x, positive_y, 1)
p_pos = np.poly1d(z_pos)
plt.plot(positive_x, p_pos(positive_x), "r--", linewidth=1.5)z_neg = np.polyfit(negative_x, negative_y, 1)
p_neg = np.poly1d(z_neg)
plt.plot(negative_x, p_neg(negative_x), "b--", linewidth=1.5)# 添加顏色條
scatter = plt.scatter([], [], c=[], cmap='viridis') # 創建用于顏色條的空散點圖
cbar = plt.colorbar(scatter, shrink=0.8)
if use_english or not use_custom_font:cbar.set_label('Color Value', rotation=270, labelpad=15)
else:cbar.set_label('顏色值', rotation=270, labelpad=15)# 添加尺寸圖例(氣泡大小表示)
sizes_legend = [30, 60, 90]
for size in sizes_legend:plt.scatter([], [], s=size, c='gray', alpha=0.6, edgecolor='black',label=f'{size} px' if use_english or not use_custom_font else f'{size} 像素')
plt.legend(title='點尺寸' if not use_english else 'Point Size',loc='lower right',frameon=True,labelspacing=1.5,handletextpad=1.5)# 添加腳注
plt.figtext(0.5, 0.01,'數據來源: 模擬數據 | 制圖日期: 2023-10-15 | 點的大小和顏色代表額外維度信息'if not use_english and use_custom_fontelse 'Data Source: Simulated Data | Date: 2023-10-15 | Size and color represent additional dimensions',ha='center', fontsize=9, color='gray')# 調整布局
plt.tight_layout(pad=3.0)
plt.subplots_adjust(bottom=0.1) # 為腳注留出空間# ==================== 保存和顯示圖表 ====================
plt.savefig('scatter_diagram.png', dpi=300, bbox_inches='tight') # 保存高分辨率圖片
plt.show()
柱狀圖/條形圖(bar/barh)
繪圖庫介紹
Python可視化 --柱形圖_python 柱狀圖-CSDN博客https://blog.csdn.net/m0_73299799/article/details/136437184
最全Python繪制條形圖(柱狀圖)_數據分析-CSDN專欄https://download.csdn.net/blog/column/10599192/113642589
核心作用 | 關鍵說明 | 適用場景 |
---|---|---|
類別比較 | 清晰對比不同分類項目的數值差異 | 產品銷量對比、部門績效評估 |
分布展示 | 顯示離散數據的頻率分布情況 | 用戶年齡分布、故障類型統計 |
趨勢分析 | 展示數據隨時間變化的趨勢(離散時間點) | 月度銷售額、季度增長率 |
排名呈現 | 直觀顯示項目的排序位置 | 城市GDP排名、熱門商品排行 |
構成分析 | 展示整體中各部分的組成關系 | 收入來源構成、時間分配比例 |
函數簽名(Function Signature)
ax.bar(x, # 條形的x坐標height, # 條形的高度(y值)width=0.8, # 條形的寬度(默認0.8)bottom=None, # 條形的底部基準(用于堆疊圖)align='center', # 條形對齊方式:'center' 或 'edge'**kwargs # 其他樣式參數(顏色、邊框等)
)ax.barh(y, width, height=0.8, left=None, *, align='center', **kwargs
)
關鍵參數詳解
bar函數
參數 | 類型 | 說明 |
---|---|---|
x | float 或 array-like | 條形的中心位置(若?align='center' )或左側邊緣(若?align='edge' ) |
height | float 或 array-like | 條形的高度(y軸方向的值) |
width | float 或 array-like | 條形的寬度(默認0.8)。值范圍建議?[0, 1] ,避免重疊 |
bottom | float 或 array-like | 條形的起始高度(y軸基準),用于堆疊圖(默認從0開始) |
align | {'center', 'edge'} | 對齊方式: -? 'center' :條形中心位于?x ?坐標處-? 'edge' :條形左側邊緣位于?x ?坐標處 |
barh函數?
參數 | 說明 | 示例值 |
---|---|---|
y | 條形在 y 軸的位置(類別) | [0, 1, 2] |
width | 條形的長度(數值) | [30, 50, 20] |
height | 條形的粗細(高度) | 0.5 |
left | 條形起始的 x 坐標(用于堆疊) | [0, 30, 80] |
align | 對齊方式 | 'center' ?或?'edge' |
color | 條形顏色 | 'skyblue' ,?['r','g','b'] |
edgecolor | 邊框顏色 | 'black' |
linewidth | 邊框寬度 | 1.5 |
alpha | 透明度 | 0.7 |
label | 圖例標簽 | 'Sales' |
xerr /yerr | 誤差線 | 數組或標量 |
常用樣式參數 (**kwargs
)?
bar函數
參數 | 說明 |
---|---|
color | 填充顏色(支持顏色名、十六進制碼、RGB元組) 例: color='skyblue' 、color=['r','g','b'] |
edgecolor | 邊框顏色(默認:'black' ) |
linewidth | 邊框寬度(默認:1.0 ) |
alpha | 透明度(0 透明 ~?1 不透明) |
label | 圖例標簽(用于ax.legend() ) |
tick_label | 替換x軸刻度的標簽(長度需與x 一致)例: tick_label=['A','B','C'] |
返回值
返回一個?BarContainer
?對象,包含所有條形(Rectangle
?實例),可通過它進一步調整樣式。?
柱狀圖和條形圖對比
特征 | 柱狀圖 (Column Chart) | 條形圖 (Bar Chart) |
---|---|---|
方向 | 垂直 (↑) | 水平 (→) |
坐標軸 | x軸=分類,y軸=數值 | y軸=分類,x軸=數值 |
最佳場景 | 時間序列、少量類別 | 長文本標簽、大量類別、排名 |
Matplotlib函數 | ax.bar() | ax.barh() |
閱讀順序 | 從左到右 | 從上到下 |
數據限制 | 類別名過長時標簽會重疊 | 處理長類別名更友好 |
示例代碼
import matplotlib.pyplot as plt
import numpy as np# 設置中文字體支持
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False# 創建數據
categories = ['蘋果', '香蕉', '橙子', '葡萄', '芒果']
values_bar = [35, 28, 42, 25, 38]
values_barh = [120, 95, 150, 80, 130]
colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#FFBE0B', '#FB5607']# 創建畫布
fig = plt.figure(figsize=(14, 10), facecolor='#f8f9fa')
fig.suptitle('水果銷售數據分析', fontsize=20, fontweight='bold', color='#2a4d69')# 創建柱狀圖
ax1 = fig.add_subplot(2, 2, 1)
bars = ax1.bar(categories, values_bar, color=colors, edgecolor='white', linewidth=2, alpha=0.9)
ax1.set_title('水果銷售額柱狀圖', fontsize=14, pad=20, color='#2a4d69')
ax1.set_ylabel('銷售額 (萬元)', fontsize=12)
ax1.set_ylim(0, 50)
ax1.grid(axis='y', linestyle='--', alpha=0.7)# 添加數據標簽
for bar in bars:height = bar.get_height()ax1.annotate(f'{height}',xy=(bar.get_x() + bar.get_width() / 2, height),xytext=(0, 3), # 3 points vertical offsettextcoords="offset points",ha='center', va='bottom',fontsize=10, fontweight='bold')# 添加箭頭注解
ax1.annotate('橙子銷量最高',xy=(2, 42),xytext=(3, 45),arrowprops=dict(arrowstyle='->', color='#2a4d69', lw=1.5, connectionstyle="arc3,rad=0.2"),fontsize=10, color='#2a4d69', bbox=dict(boxstyle="round,pad=0.3", fc='white', ec='#2a4d69', alpha=0.8))# 創建水平條形圖
ax2 = fig.add_subplot(2, 2, 2)
bars_h = ax2.barh(categories, values_barh, color=colors, edgecolor='white', linewidth=2, alpha=0.9)
ax2.set_title('水果銷量條形圖', fontsize=14, pad=20, color='#2a4d69')
ax2.set_xlabel('銷量 (噸)', fontsize=12)
ax2.set_xlim(0, 170)
ax2.grid(axis='x', linestyle='--', alpha=0.7)# 添加數據標簽
for bar in bars_h:width = bar.get_width()ax2.annotate(f'{width}',xy=(width, bar.get_y() + bar.get_height() / 2),xytext=(5, 0), # 向右偏移5點textcoords="offset points",ha='left', va='center',fontsize=10, fontweight='bold')# 添加圓圈注解
ax2.annotate('芒果銷量突出',xy=(130, 4),xytext=(140, 3.5),arrowprops=dict(arrowstyle='->', color='#2a4d69', lw=1.5),fontsize=10, color='#2a4d69',bbox=dict(boxstyle="circle,pad=0.3", fc='#FB5607', ec='white', alpha=0.7))# 創建堆疊柱狀圖
ax3 = fig.add_subplot(2, 2, 3)
quarter = ['第一季度', '第二季度', '第三季度', '第四季度']
fruit_a = [20, 35, 30, 25]
fruit_b = [15, 25, 20, 30]
fruit_c = [10, 20, 25, 15]bottom = np.zeros(len(quarter))
fruits = [fruit_a, fruit_b, fruit_c]
fruit_names = ['蘋果', '香蕉', '橙子']for i, fruit in enumerate(fruits):bars = ax3.bar(quarter, fruit, bottom=bottom, color=colors[i],edgecolor='white', linewidth=1, alpha=0.9, label=fruit_names[i])bottom += fruit# 在每段上添加標簽for j, bar in enumerate(bars):height = bar.get_height()if height > 0: # 僅當高度大于0時添加標簽ax3.annotate(f'{height}',xy=(bar.get_x() + bar.get_width() / 2, bar.get_y() + height / 2),ha='center', va='center',color='white', fontsize=9, fontweight='bold')ax3.set_title('季度水果銷量堆疊圖', fontsize=14, pad=20, color='#2a4d69')
ax3.set_ylabel('銷量 (噸)', fontsize=12)
ax3.legend(loc='upper right')
ax3.grid(axis='y', linestyle='--', alpha=0.7)# 添加區域注解
ax3.annotate('香蕉銷量顯著增長',xy=(1, 45),xytext=(0.5, 60),arrowprops=dict(arrowstyle='fancy', color='#4ECDC4', lw=1.5, connectionstyle="arc3,rad=0.3"),fontsize=10, color='#2a4d69',bbox=dict(boxstyle="round,pad=0.3", fc='#4ECDC4', ec='#2a4d69', alpha=0.3))# 創建分組條形圖
ax4 = fig.add_subplot(2, 2, 4)
x = np.arange(len(quarter))
width = 0.25# 創建分組數據
bars1 = ax4.bar(x - width, fruit_a, width, color=colors[0], label='蘋果', alpha=0.9)
bars2 = ax4.bar(x, fruit_b, width, color=colors[1], label='香蕉', alpha=0.9)
bars3 = ax4.bar(x + width, fruit_c, width, color=colors[2], label='橙子', alpha=0.9)ax4.set_title('季度水果銷量對比', fontsize=14, pad=15, color='#2a4d69')
ax4.set_xticks(x)
ax4.set_xticklabels(quarter)
ax4.legend()
ax4.grid(axis='y', linestyle='--', alpha=0.7)# 添加數據標簽
for bars in [bars1, bars2, bars3]:for bar in bars:height = bar.get_height()ax4.annotate(f'{height}',xy=(bar.get_x() + bar.get_width() / 2, height),xytext=(0, 3),textcoords="offset points",ha='center', va='bottom',fontsize=9)# 添加連接線注解
ax4.annotate('橙子銷量在第三季度最高',xy=(2.25, 25),xytext=(2.1, 40),arrowprops=dict(arrowstyle='->', color='#45B7D1', lw=1.5, connectionstyle="arc3,rad=0.3"),fontsize=10, color='#2a4d69',bbox=dict(boxstyle="round,pad=0.3", fc='#45B7D1', ec='#2a4d69', alpha=0.3))# 添加圖例說明
fig.text(0.5, 0.02, '數據來源: 2023年水果市場銷售報告 | 可視化: Matplotlib',ha='center', fontsize=10, color='#4b86b4', alpha=0.7)# 調整布局
plt.tight_layout(rect=(0, 0.03, 1, 0.95)) # 將方括號改為圓括號
plt.subplots_adjust(wspace=0.3, hspace=0.3)# 保存為圖片
plt.savefig('bar_Graph.png', dpi=300, bbox_inches='tight', facecolor=fig.get_facecolor())# 添加自定義水印
fig.text(0.5, 0.5, '可視化示例',fontsize=60, color='gray', alpha=0.1,ha='center', va='center', rotation=30)plt.show()
餅圖/環形圖(pie)
繪圖庫介紹
python畫圖|餅圖繪制教程_python畫餅圖-CSDN博客https://blog.csdn.net/weixin_44855046/article/details/141863459
核心作用 | 關鍵說明 | 優勢 |
---|---|---|
比例可視化 | 直觀顯示部分在整體中的占比 | 一眼看懂構成關系 |
重點突出 | 強調關鍵組成部分的主導地位 | 聚焦核心要素 |
簡單對比 | 快速比較2-5個部分的相對大小 | 避免復雜數據處理 |
整體意識 | 強化"100%"的整體概念 | 自然傳達完整性 |
函數簽名(Function Signature)
ax.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6,shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True,wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False,*, normalize=True, data=None
)
核心參數詳解
參數 | 類型 | 說明 | 默認值 |
---|---|---|---|
x | 數組 | 每個扇形的數值(自動歸一化計算百分比) | 必填 |
explode | 數組 | 扇形偏移中心的距離(比例值,如?[0, 0.1, 0] ) | None |
labels | 列表 | 每個扇形的標簽文本 | None |
colors | 列表 | 扇形顏色(支持顏色名或 HEX) | 當前色彩循環 |
autopct | 字符串/函數 | 顯示百分比的格式(如?'%1.1f%%' ) | None |
pctdistance | 浮點數 | 百分比文本離圓心的距離(半徑比例) | 0.6 |
labeldistance | 浮點數 | 標簽文本離圓心的距離(半徑比例) | 1.1 |
startangle | 浮點數 | 起始繪制角度(0 表示正東方向,逆時針旋轉) | 0 |
radius | 浮點數 | 餅圖半徑 | 1 |
wedgeprops | 字典 | 扇形屬性(如邊緣顏色、線寬:{'edgecolor': 'black', 'linewidth': 2} ) | None |
textprops | 字典 | 文本屬性(如字體大小、顏色:{'fontsize': 12, 'color': 'red'} ) | None |
rotatelabels | 布爾值 | 是否旋轉標簽至對應扇形角度 | False |
shadow | 布爾值 | 是否添加陰影效果 | False |
?返回值
返回三個對象組成的元組:
-
wedges
: 扇形對象列表(matplotlib.patches.Wedge
) -
texts
: 標簽文本對象列表(Text
) -
autotexts
: 百分比文本對象列表(若?autopct=None
?則為空列表)
餅圖和環形圖對比
特性 | 餅狀圖 | 環形圖 | 嵌套環形圖 |
---|---|---|---|
結構 | 實心圓 | 空心圓 | 多層同心空心圓 |
中心區域 | 無特殊用途 | 可放置匯總數據 | 通常留空 |
數據維度 | 單層數據 | 單層數據 | 多層數據 |
比例表示 | 扇形面積 | 弧長 | 弧長 |
Matplotlib參數 | 默認 | wedgeprops={'width':x} | 多pie() 調用+不同radius |
視覺重心 | 整體比例 | 部分與整體關系 | 跨數據集比較 |
示例代碼
import matplotlib.pyplot as plt# 設置中文字體支持
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 創建1行3列的子圖布局,調整寬度比例
fig, axes = plt.subplots(1, 3, figsize=(20, 7),gridspec_kw={'width_ratios': [1, 1, 1.2]}) # 增加第三個子圖寬度# -------------------- 第一個子圖:基礎餅圖 --------------------
ax1 = axes[0]
labels1 = ['蘋果', '香蕉', '橙子', '葡萄']
sizes1 = [30, 25, 20, 25]
colors1 = ['#FF9999', '#66B3FF', '#99FF99', '#FFCC99']
explode = (0.05, 0, 0, 0)wedges1, texts1, autotexts1 = ax1.pie(sizes1,explode=explode,labels=labels1,colors=colors1,autopct='%1.1f%%',startangle=90,shadow=True,textprops={'fontsize': 10}
)for autotext in autotexts1:autotext.set_color('white')autotext.set_fontweight('bold')ax1.set_title('基礎餅圖', fontsize=14, pad=15)
ax1.axis('equal')# -------------------- 第二個子圖:環形圖 --------------------
ax2 = axes[1]
labels2 = ['蘋果', '香蕉', '橙子', '葡萄', '其他']
sizes2 = [25, 30, 15, 20, 10]
colors2 = ['#FF6B6B', '#4ECDC4', '#FFE66D', '#6A0572', '#1A535C']wedges2, texts2, autotexts2 = ax2.pie(sizes2,colors=colors2,startangle=90,wedgeprops=dict(width=0.4, edgecolor='w'),autopct=lambda p: f'{p:.1f}%' if p > 5 else '',pctdistance=0.85
)centre_circle = plt.Circle((0,0), 0.3, fc='white')
ax2.add_artist(centre_circle)
ax2.text(0, 0, '水果總銷量', ha='center', va='center', fontsize=12)ax2.set_title('環形圖', fontsize=14, pad=15)
ax2.axis('equal')# -------------------- 第三個子圖:嵌套環形圖 --------------------
ax3 = axes[2]# 數據
inner_labels = ['蘋果', '香蕉', '其他']
inner_sizes = [40, 35, 25]
outer_labels = ['紅富士', '青蘋果', '進口蕉', '本地蕉', '橙子', '葡萄', '草莓']
outer_sizes = [15, 25, 20, 15, 10, 10, 5]# 顏色
inner_colors = ['#FF6B6B','#4ECDC4','#1A535C']
outer_colors = ['#FF9999', '#FF6B6B', '#88D8C0', '#4ECDC4', '#FFE66D', '#6A0572', '#1A535C']# 繪制外環(縮小尺寸)
wedges_outer, _, autotexts_outer = ax3.pie(outer_sizes,radius=1.0, # 縮小半徑colors=outer_colors,wedgeprops=dict(width=0.3, edgecolor='w'), # 減小環寬startangle=90,pctdistance=0.85,autopct=lambda p: f'{p:.1f}%' if p > 4 else ''
)# 繪制內環
wedges_inner, _, autotexts_inner = ax3.pie(inner_sizes,radius=1.0 - 0.3, # 相應縮小內環半徑colors=inner_colors,wedgeprops=dict(width=0.3, edgecolor='w'),startangle=90,pctdistance=0.75,autopct='%1.1f%%'
)# 添加中心文字
ax3.text(0, 0, '水果分類', ha='center', va='center', fontsize=12, weight='bold')# 優化圖例:放在下方并分兩列顯示
legend = ax3.legend(wedges_outer + wedges_inner,outer_labels + inner_labels,title="水果種類",loc='upper center',bbox_to_anchor=(-0.68, 0), # 放在下方ncol=3, # 分三列顯示fontsize=9
)
legend.get_title().set_fontsize(10) # 圖例標題字號ax3.set_title('嵌套環形圖', fontsize=14, pad=15)
ax3.axis('equal')# -------------------- 整體設置和保存 --------------------
plt.suptitle('水果銷售數據可視化分析', fontsize=18, weight='bold')# 調整子圖間距和整體布局
plt.tight_layout()
plt.subplots_adjust(top=0.85, bottom=0.2, wspace=0.3) # 增加底部空間和子圖間距# 保存圖像(提高DPI)
plt.savefig('pie_charts_comparison.png', dpi=300, bbox_inches='tight')
plt.savefig('pie_charts_comparison.pdf', bbox_inches='tight') # PDF格式更清晰print("圖像已保存為 'pie_charts_comparison.png' 和 'pie_charts_comparison.pdf'")# 顯示圖像
plt.show()
直方圖(hist)
繪圖庫介紹
Python繪圖-5直方圖_python繪制直方圖-CSDN博客https://blog.csdn.net/2202_75971130/article/details/135192791
作用 | 說明 |
---|---|
1. 展示數據分布 | 揭示數據集中在哪些區間、分散程度如何(如單峰、雙峰、左偏/右偏)。 |
2. 識別中心趨勢 | 通過最高柱子的位置快速定位數據密集區(眾數所在區間)。 |
3. 分析離散程度 | 柱子寬度和分散情況反映數據波動范圍(越分散說明數據差異越大)。 |
4. 檢測異常值 | 遠離主分布區的孤立柱子可能暗示異常值。 |
5. 判斷分布形狀 | 對稱(正態分布)、左偏(數據集中在右側)、右偏(數據集中在左側)、多峰等。 |
6. 比較不同數據集 | 疊加多個直方圖可對比不同群體的分布差異(如A/B測試結果)。 |
函數簽名(Function Signature)
n, bins, patches = ax.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, **kwargs
)
核心參數詳解?
參數 | 默認值 | 類型 | 說明 | 常用值/示例 |
---|---|---|---|---|
x | 必填 | 數組 | 輸入數據 | [1, 2, 3, 4, 5] |
bins | 'auto' | int/序列/str | 分箱數量或邊界 | 10 (分10箱)[0,5,10,20] (自定義邊界)'sturges' (自動計算) |
range | None | 元組 | 數據范圍限制 | (0, 100) (僅統計0-100) |
density | False | bool | 歸一化處理 | True (面積=1的概率密度) |
weights | None | 數組 | 數據點權重 | [0.1, 0.2, 0.3, ...] |
cumulative | False | bool/int | 累積分布 | True (正向累積)-1 (反向累積) |
bottom | None | 標量/數組 | 基線位置 | 10 (所有柱子從y=10開始) |
histtype | 'bar' | str | 直方圖類型 | 'bar' (傳統柱狀)'step' (線框)'stepfilled' (填充線框) |
align | 'mid' | str | 柱子對齊方式 | 'mid' (居中)'left' (左對齊)'right' (右對齊) |
orientation | 'vertical' | str | 方向 | 'vertical' (垂直)'horizontal' (水平) |
rwidth | None | float | 柱子相對寬度 | 0.8 (占bin寬80%) |
log | False | bool | 對數坐標 | True (y軸對數化) |
color | None | str/列表 | 顏色 | 'skyblue' ['r','g','b'] |
label | None | str | 圖例標簽 | 'Male' |
stacked | False | bool | 堆疊顯示 | True (多組數據堆疊) |
alpha | 1.0 | float | 透明度 | 0.7 (半透明效果) |
?返回值
-
n
: 數組,每個 bin 的頻數(或密度值)。 -
bins
: 數組,bin 的邊界值(長度為?len(n)+1
)。 -
patches
: 直方圖矩形對象列表(用于自定義樣式)。
直方圖和柱狀圖對比?
特征 | 直方圖 (Histogram) | 柱狀圖 (Bar Chart) |
---|---|---|
數據性質 | 連續數值數據 | 分類數據(或離散數值) |
X軸含義 | 數值區間(Bin) | 類別標簽(如國家、產品) |
柱子間距 | 無間距(表示連續區間) | 有間距(強調獨立性) |
柱子寬度 | 可不等寬(由數據分布決定) | 通常等寬 |
排序 | 按數值大小自動排序 | 任意排序(可按需調整) |
統計目標 | 展示數據分布/頻率 | 比較各類別數量大小 |
數學基礎 | 概率密度估計 | 分類計數 |
空值處理 | 空區間高度=0(必須顯示所有區間) | 缺失類別可省略 |
坐標軸 | 僅數值軸 | 一軸數值,另一軸分類 |
示例場景 | 年齡分布、考試成績分布 | 各國GDP對比、月度銷售額 |
?經驗法則
-
當X軸是數值范圍且需看分布形狀?→ 直方圖
-
當X軸是類別標簽且需比較大小?→ 柱狀圖
-
當數據量<10時優先用柱狀圖,>30時優先用直方圖
?示例代碼
import numpy as np
import matplotlib.pyplot as plt# 設置中文字體支持(如果需要顯示中文)
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'Microsoft YaHei', 'WenQuanYi Zen Hei', 'sans-serif']
plt.rcParams['axes.unicode_minus'] = False# 生成示例數據(模擬學生考試成績)
np.random.seed(42)
math_scores = np.random.normal(loc=75, scale=12, size=200) # 數學成績
physics_scores = np.random.normal(loc=68, scale=15, size=200) # 物理成績# 創建圖表和坐標軸
fig, ax = plt.subplots(figsize=(12, 8))# 繪制雙直方圖(比較兩科成績)
n1, bins1, patches1 = ax.hist(math_scores, bins=12, color='skyblue', alpha=0.7,edgecolor='navy', label='數學成績')
n2, bins2, patches2 = ax.hist(physics_scores, bins=12, color='salmon', alpha=0.7,edgecolor='darkred', label='物理成績')# 添加標題和標簽
ax.set_title('數學與物理成績分布對比', fontsize=16, pad=20)
ax.set_xlabel('考試分數', fontsize=14)
ax.set_ylabel('學生人數', fontsize=14)# 添加網格線
ax.grid(axis='y', linestyle='--', alpha=0.6)# 添加圖例
ax.legend(fontsize=12)# 添加柱子頂部的頻數注解
def add_count_annotations(patches, counts, bins, offset=3):for i, patch in enumerate(patches):bin_center = (bins[i] + bins[i+1]) / 2height = counts[i]if height > 0: # 只標注有值的柱子ax.annotate(f'{int(height)}',xy=(bin_center, height),xytext=(0, offset),textcoords='offset points',ha='center',va='bottom',fontsize=10)add_count_annotations(patches1, n1, bins1)
add_count_annotations(patches2, n2, bins2, offset=5) # 物理成績的注解稍高# 添加統計信息注解
math_mean = np.mean(math_scores)
physics_mean = np.mean(physics_scores)
ax.axvline(math_mean, color='blue', linestyle='--', linewidth=2)
ax.axvline(physics_mean, color='red', linestyle='--', linewidth=2)ax.annotate(f'數學平均分: {math_mean:.1f}',xy=(math_mean, np.max(n1)*0.8),xytext=(math_mean - 15, np.max(n1)*0.8 + 6),arrowprops=dict(arrowstyle='->', color='blue', connectionstyle="arc3"),fontsize=12, color='blue', weight='bold')ax.annotate(f'物理平均分: {physics_mean:.1f}',xy=(physics_mean, np.max(n2)*0.7),xytext=(physics_mean + 5.8, np.max(n2)*0.7 + 5),arrowprops=dict(arrowstyle='->', color='red'),fontsize=12, color='red', weight='bold')# 添加差異說明注解
ax.annotate('數學成績整體高于物理成績\n且分布更為集中',xy=(80, 25),xytext=(90, 30),arrowprops=dict(arrowstyle='fancy', color='green', connectionstyle="angle3,angleA=0,angleB=90"),fontsize=12, color='green', bbox=dict(boxstyle="round,pad=0.3", fc='lightyellow', ec='olive', alpha=0.8))# 保存高分辨率圖片
plt.tight_layout()
plt.savefig('histogram_with_annotations.png', dpi=300, bbox_inches='tight')
plt.savefig('histogram_with_annotations.pdf', bbox_inches='tight') # 矢量圖版本print("圖片已保存為 'histogram_with_annotations.png' 和 'histogram_with_annotations.pdf'")# 顯示圖表
plt.show()
箱線圖(boxplot)
繪圖庫介紹
Python繪圖-7箱圖_python 箱線圖-CSDN博客https://blog.csdn.net/2202_75971130/article/details/136337160
作用 | 說明 |
---|---|
1. 展示數據分布 | 用5個統計量(最小值、Q1、中位數、Q3、最大值)概括數據分布位置和范圍。 |
2. 識別異常值 | 超出上下須(1.5×IQR范圍)的點被單獨標記,快速定位異常值。 |
3. 分析偏態與對稱性 | 中位數在箱體的位置反映數據偏斜方向(左偏/右偏)。 |
4. 比較多組數據 | 并排箱線圖可高效對比多組數據的分布差異(如不同類別/時間)。 |
5. 檢測數據離散度 | 箱體長度(IQR)和須的長度反映數據波動范圍(IQR越小,數據越集中)。 |
函數簽名(Function Signature)
plt.boxplot(x,notch=None,sym=None,vert=None,whis=None,positions=None,widths=None,patch_artist=None,bootstrap=None,usermedians=None,conf_intervals=None,meanline=None,showmeans=None,showcaps=None,showbox=None,showfliers=None,boxprops=None,labels=None,flierprops=None,medianprops=None,meanprops=None,capprops=None,whiskerprops=None,manage_ticks=True,autorange=False,zorder=None
)
?核心參數詳解表
參數 | 類型 | 默認值 | 說明 | 示例 |
---|---|---|---|---|
x | Array/Sequence | (必填) | 輸入數據(一維數組或數組序列) | x=[data1, data2] |
notch | bool | False | 是否繪制缺口箱線圖(展示中位數置信區間) | notch=True |
sym | str | 'b+' | 離群點標記樣式 | sym='rs' (紅色方塊) |
vert | bool | True | 箱線圖方向(True =垂直,False =水平) | vert=False |
whis | float | 1.5 | 定義須線長度的IQR倍數 | whis=2.0 |
positions | array-like | [1,2..n] | 箱線圖的定位坐標 | positions=[1,3,5] |
widths | float/array | 0.5 | 箱體寬度(標量或每個箱體寬度數組) | widths=0.3 |
patch_artist | bool | False | 是否用顏色填充箱體 | patch_artist=True |
labels | list/str | None | 分組標簽 | labels=['A','B'] |
showmeans | bool | False | 是否顯示均值標記 | showmeans=True |
meanline | bool | False | 是否用線(而非點)表示均值 | meanline=True |
showcaps | bool | True | 是否顯示須線末端橫杠 | showcaps=False |
showbox | bool | `True`` | 是否顯示箱體 | showbox=False |
showfliers | bool | True | 是否顯示離群值 | showfliers=False |
boxprops | dict | None | 箱體樣式屬性 | boxprops=dict(facecolor='red') |
whiskerprops | dict | None | 須線樣式屬性 | whiskerprops=dict(linestyle='--') |
capprops | dict | None | 須線末端橫杠樣式屬性 | capprops=dict(linewidth=2) |
medianprops | dict | None | 中位數線樣式屬性 | medianprops=dict(color='gold') |
meanprops | dict | None | 均值標記樣式屬性 | meanprops=dict(marker='D') |
flierprops | dict | None | 離群點樣式屬性 | flierprops=dict(marker='x') |
zorder | float | None | 繪圖層級(控制疊放順序) | zorder=10 |
示例代碼
import matplotlib.pyplot as plt
import numpy as np
import os# 設置中文顯示
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'Microsoft YaHei', 'sans-serif']
plt.rcParams['axes.unicode_minus'] = False# 創建輸出目錄
output_dir = 'output'
os.makedirs(output_dir, exist_ok=True)# 生成更真實的示例數據(模擬產品測試分數)
np.random.seed(42)
product_A = np.random.normal(85, 12, 200)
product_B = np.random.normal(92, 8, 200)
product_C = np.random.normal(78, 15, 200)
product_D = np.random.normal(88, 10, 200)
data = [product_A, product_B, product_C, product_D]# 創建圖形和子圖
plt.figure(figsize=(12, 8))
ax = plt.subplot(111)# 繪制箱線圖
box = plt.boxplot(data,patch_artist=True,showmeans=True, # 顯示均值點meanprops={'marker': 'D', 'markerfacecolor': 'gold', 'markeredgecolor': 'black'},labels=['產品A', '產品B', '產品C', '產品D'])# 設置箱體顏色
colors = ['#FF9999', '#66B2FF', '#99FF99', '#FFCC99']
for patch, color in zip(box['boxes'], colors):patch.set_facecolor(color)patch.set_alpha(0.8) # 添加透明度# 設置箱線樣式
for element in ['whiskers', 'caps', 'medians']:plt.setp(box[element], color='black', linewidth=1.5)# 添加注釋
for i, d in enumerate(data):# 計算關鍵統計量median = np.median(d)q1 = np.percentile(d, 25)q3 = np.percentile(d, 75)iqr = q3 - q1mean = np.mean(d)upper_bound = q3 + 1.5 * iqrlower_bound = q1 - 1.5 * iqr# 標注中位數plt.annotate(f'中位數: {median:.1f}',xy=(i + 1, median),xytext=(i + 1.2, median + 3),fontsize=10,arrowprops=dict(arrowstyle="->", color='black', alpha=0.7))# 標注平均值plt.annotate(f'平均值: {mean:.1f}',xy=(i + 1, mean),xytext=(i + 1.2, mean - 5),fontsize=9,color='darkblue',arrowprops=dict(arrowstyle="->", color='darkblue', alpha=0.5))# 標注IQR范圍plt.text(i + 1.1, (q1 + q3) / 2, f'IQR: {iqr:.1f}',fontsize=9, color='darkgreen',verticalalignment='center')# 添加整體標題和說明
plt.title('四種產品質量測試分數分布對比', fontsize=16, pad=20, fontweight='bold')
plt.xlabel('產品型號', fontsize=12, labelpad=10)
plt.ylabel('測試分數', fontsize=12, labelpad=10)# 添加網格線
plt.grid(axis='y', linestyle='--', alpha=0.5)# 添加圖例
from matplotlib.patches import Patchlegend_elements = [Patch(facecolor=colors[0], label='產品A'),Patch(facecolor=colors[1], label='產品B'),Patch(facecolor=colors[2], label='產品C'),Patch(facecolor=colors[3], label='產品D'),plt.Line2D([0], [0], marker='D', color='w', markerfacecolor='gold', markersize=10, label='平均值'),plt.Line2D([0], [0], color='black', lw=2, label='中位數')
]
ax.legend(handles=legend_elements, loc='upper right', fontsize=10)# 添加數據來源說明
plt.figtext(0.5, 0.01, '數據來源: 2023年產品質量測試報告 | 注: 箱線圖基于200個樣本數據',ha='center', fontsize=9, color='gray')# 調整布局
plt.tight_layout()
plt.subplots_adjust(bottom=0.1) # 為底部文本留出空間# 保存圖片到文件 (多種格式)
png_path = os.path.join(output_dir, 'boxplot_with_annotations.png')
pdf_path = os.path.join(output_dir, 'boxplot_with_annotations.pdf')
svg_path = os.path.join(output_dir, 'boxplot_with_annotations.svg')# 保存為PNG (適合網頁使用)
plt.savefig(png_path, dpi=300, bbox_inches='tight')
# 保存為PDF (適合印刷和高質量打印)
plt.savefig(pdf_path, format='pdf', bbox_inches='tight')
# 保存為SVG (矢量格式,可編輯)
plt.savefig(svg_path, format='svg', bbox_inches='tight')print(f"圖表已保存至: {png_path}")
print(f"圖表已保存至: {pdf_path}")
print(f"圖表已保存至: {svg_path}")# 顯示圖形
plt.show()
熱力圖(heatmap)
繪圖庫介紹
用 Python 繪制熱力圖(Heatmap)詳解:從數據到可視化全流程(第三天)_python heatmap-CSDN博客https://blog.csdn.net/2401_84301183/article/details/146536553
類別 | 具體作用/場景 | 說明/示例 |
---|---|---|
核心作用 | 直觀展示數據密度/強度分布 | 用顏色深淺(暖色表高值,冷色表低值)快速揭示數據集中高低值區域及分布模式。 |
揭示模式、趨勢和異常 | 識別熱點(高值聚集)、冷點(低值聚集)、梯度變化、異常值。 | |
高效比較多變量/類別間關系 | 矩陣熱力圖中通過顏色比較行、列代表的類別/變量間關系強度(如相關性、頻率)。 | |
簡化高維數據表達 | 將二維(如坐標+值)或三維(如行類+列類+值)數據壓縮到平面視圖,用顏色編碼。 | |
空間效率高 | 在有限空間內展示大量數據點或關系對比,優于重疊散點圖或多條形圖。 | |
主要實現場景 | 地理空間數據分析 (Geospatial) | 應用領域:?人口、犯罪、交通、房產、疾病、天氣、商業選址等。 示例:?人口密度圖、交通擁堵熱圖、疫情分布圖、商場客流量熱圖。 |
網站和用戶行為分析 (Web & UX) | 應用領域:?網頁/App設計優化、用戶體驗研究。 示例:?點擊熱圖(分析按鈕點擊)、滾動熱圖(分析頁面瀏覽深度)、鼠標移動熱圖(分析瀏覽路徑)、眼動追蹤熱圖(分析視覺焦點)。 | |
數據分析和統計學 (Data Analysis & Statistics) | 應用領域:?探索性數據分析、模型評估、關系挖掘。 示例:?相關性矩陣(展示變量間相關系數)、混淆矩陣(評估分類模型性能)、缺失值模式熱圖、聚類結果熱圖(展示基因表達模式等)。 |
函數簽名(Function Signature)
sns.heatmap(data, # 必需參數:二維數據(數組、DataFrame)vmin=None, # 顏色映射最小值vmax=None, # 顏色映射最大值cmap=None, # 顏色方案(如 'viridis', 'coolwarm', 'RdBu_r')center=None, # 顏色中心值(常用于有正負的數據)robust=False, # 抗異常值縮放(使用分位數替代極值)annot=None, # 是否在格子中顯示數值(True/False 或 同shape數組)fmt='.2g', # 數值格式(如 '.1f' 保留1位小數)annot_kws=None, # 注釋文本樣式(字典,如 {'size':10})linewidths=0, # 格子邊框寬度linecolor='white', # 邊框顏色cbar=True, # 是否顯示顏色條cbar_kws=None, # 顏色條設置(字典,如 {'label':'Score'})square=False, # 是否強制為正方形xticklabels='auto', # X軸標簽(True/False/列表/'auto')yticklabels='auto', # Y軸標簽(同上)mask=None, # 遮蓋部分數據(True位置不顯示)ax=None, # 指定繪圖的Axes對象**kwargs # 其他matplotlib參數
)
核心參數詳解表
參數 | 默認值 | 數據類型 | 說明 |
---|---|---|---|
data | - | 2D array/DataFrame | 必需參數,輸入矩陣數據 |
vmin | None | float | 顏色映射最小值 |
vmax | None | float | 顏色映射最大值 |
cmap | None | str/Colormap | 顏色映射方案(如 'viridis', 'coolwarm', 'RdBu_r') |
center | None | float | 顏色中心值(用于有正負值的數據) |
annot | None | bool/array | 是否在格子中顯示數值(True 或同形數組) |
fmt | '.2g' | str | 數值格式(如 '.2f'=兩位小數,'d'=整數) |
linewidths | 0 | float | 格子邊框寬度(0=無邊框) |
linecolor | 'white' | str | 邊框顏色 |
cbar | True | bool | 是否顯示顏色條 |
cbar_kws | None | dict | 顏色條參數(如 {'label': 'Score'}) |
square | False | bool | 是否強制為正方形 |
xticklabels | 'auto' | bool/list/'auto' | X軸標簽控制(True=顯示,False=隱藏) |
yticklabels | 'auto' | bool/list/'auto' | Y軸標簽控制 |
mask | None | bool array | 遮蓋部分數據(True位置留白) |
robust | False | bool | 是否使用分位數抗異常值 |
annot_kws | None | dict | 注釋文本樣式(如 {'size':10, 'color':'black'}) |
ax | None | matplotlib Axes | 指定繪圖的坐標軸 |
示例代碼
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.colors import LinearSegmentedColormap# 設置中文支持(如果需要)
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'Microsoft YaHei', 'sans-serif']
plt.rcParams['axes.unicode_minus'] = False# 創建示例數據
def generate_sample_data():# 創建日期范圍dates = pd.date_range(start='2023-01-01', end='2023-01-15')# 創建時間范圍times = [f"{hour:02d}:00" for hour in range(8, 18)]# 創建隨機數據np.random.seed(42)data = np.random.rand(len(dates), len(times)) * 100# 添加一些模式使數據更有趣for i in range(len(dates)):# 周末模式if dates[i].weekday() >= 5: # 周六和周日data[i, :] *= 0.7 # 周末值較低# 中午高峰模式data[i, 4:7] *= 1.5 # 中午12點到下午2點# 創建DataFramedf = pd.DataFrame(data, index=dates.strftime('%Y-%m-%d'), columns=times)return df# 創建自定義顏色映射
def create_custom_colormap():colors = ["#2a9d8f", "#e9c46a", "#f4a261", "#e76f51"]return LinearSegmentedColormap.from_list("custom_cmap", colors)# 繪制熱力圖并添加注解
def plot_heatmap_with_annotations(df):# 創建圖形plt.figure(figsize=(14, 10))# 創建自定義顏色映射custom_cmap = create_custom_colormap()# 繪制熱力圖ax = sns.heatmap(df,cmap=custom_cmap,annot=True, # 顯示數值注解fmt=".1f", # 數值格式(保留一位小數)annot_kws={"size": 9, "color": "black"}, # 注解文本樣式linewidths=0.5, # 單元格之間的線條寬度linecolor="white", # 線條顏色cbar_kws={"label": "活動強度", "shrink": 0.8} # 顏色條設置)# 設置標題和標簽plt.title("每日活動強度熱力圖 (2023年1月1日-15日)", fontsize=16, pad=20)plt.xlabel("時間", fontsize=12)plt.ylabel("日期", fontsize=12)# 旋轉x軸標簽plt.xticks(rotation=45, ha='right')# 添加網格線(在熱力圖后面)ax.set_facecolor('#f0f0f0')ax.grid(which='major', axis='both', linestyle='-', color='white', linewidth=0.5)# 調整布局plt.tight_layout()# 保存圖表save_path = "heatmap_with_annotations.png"plt.savefig(save_path, dpi=300, bbox_inches='tight')# 顯示圖表plt.show()return save_path# 主程序
if __name__ == "__main__":# 生成示例數據data_df = generate_sample_data()print("生成的熱力圖數據示例:")print(data_df.head())# 繪制并保存熱力圖saved_path = plot_heatmap_with_annotations(data_df)print(f"\n熱力圖已保存至: {saved_path}")
小提琴圖(violinplot)
繪圖庫介紹
用python繪制小提琴圖的基本流程及其操作_python 小提琴圖-CSDN博客https://blog.csdn.net/weixin_70682362/article/details/148018533
作用類別 | 核心作用描述 | 典型實現場景 | 對比優勢 |
---|---|---|---|
分布形態可視化 | 直觀展示連續數據的整體分布形狀、概率密度(哪里密集、哪里稀疏) | 1. 觀察單個變量的數據分布特征(單峰、雙峰、多峰、對稱、偏態)。 2. 數據探索階段了解數據的基本形態。 | 優于箱線圖:清晰揭示分布形狀(如多峰性、不對稱性),箱線圖僅顯示摘要統計。 |
集中趨勢比較 | 顯示數據分布的中心位置(通常結合箱線圖元素顯示中位數/四分位數) | 1. 比較不同類別/分組數據的中心趨勢(如中位數)差異。 2. 觀察不同實驗條件下結果的中心位置變化。 | 結合密度與統計量:既看密度集中區域,也看具體中位數位置。 |
離散程度比較 | 通過“小提琴”的寬度變化展示數據分布的離散程度(寬=分散,窄=集中) | 1. 比較不同類別/分組數據的變異性或一致性(如評估不同生產工藝的穩定性)。 2. 識別方差差異顯著的組別。 | 優于箱線圖:寬度變化直觀體現數據點在整個值域上的疏密程度,而不僅是IQR。 |
分布對稱性/偏度分析 | 通過形狀的對稱性判斷數據分布是左偏(負偏)、右偏(正偏)還是對稱 | 1. 分析數據是否符合對稱分布假設(如某些統計檢驗前提)。 2. 識別收入、響應時間等常見偏態數據的偏斜方向。 | 優于直方圖/密度圖:在多組比較時,并排小提琴圖更易對比不同組的偏斜情況。 |
多組分布對比 | 將多個組/類別的分布并排或疊加顯示,便于直接比較其形態、中心和離散度差異 | 1. 比較不同產品/型號的性能指標分布。 2. 分析不同營銷策略下客戶購買金額的分布差異。 3. 評估不同治療方法下患者康復時間的分布。 4. 對比不同地區的氣溫分布模式。 5. 分析不同用戶群(如新/老用戶)使用時長/消費頻率的分布。 | 核心優勢:最擅長同時比較多個組的完整分布特征,信息量遠大于僅比較均值或中位數。 |
異常值檢測 (輔助) | 結合箱線圖元素(通常內嵌),可識別潛在的異常值點 | 1. 在觀察整體分布的同時,輔助查看是否存在顯著偏離主體的極端值。 | 結合優勢:密度形態提供上下文,箱線圖元素標記異常點。 |
數據清洗/驗證 | 揭示數據分布中意想不到的模式或問題(如雙峰可能暗示數據混合了不同群體) | 1. 數據質量檢查:發現分布異常(如預期單峰卻出現雙峰,可能需檢查數據來源或分組)。 2. 識別數據子群或潛在分段。 | 揭示隱藏信息:能提示數據背后可能存在的未考慮因素或分組。 |
函數簽名(Function Signature)
seaborn.violinplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, bw='scott', cut=2, scale='area', scale_hue=True, gridsize=100,width=0.8, inner='box', split=False, dodge=True, orient=None,linewidth=None, color=None, palette=None, saturation=0.75,ax=None, **kwargs
)
核心參數詳解表
參數 | 類型 | 默認值 | 說明 |
---|---|---|---|
x | 字符串/數組 | None | X軸變量(分類數據) |
y | 字符串/數組 | None | Y軸變量(數值數據) |
hue | 字符串 | None | 分組變量(次級分類維度) |
data | DataFrame | None | 數據源(需配合x/y/hue使用) |
order | 列表 | None | 指定x變量順序(如['Mon','Tue','Wed']) |
hue_order | 列表 | None | 指定hue分組順序(如['Male','Female']) |
bw | 字符串/浮點數 | 'scott' | 核密度估計帶寬:'scott' /'silverman' (自動計算)數值(值越小越貼合數據) |
scale | 字符串 | 'area' | 小提琴寬度縮放方式:'area' (面積相同)'count' (寬度與樣本量成正比)'width' (最大寬度相同) |
inner | 字符串 | 'box' | 內部顯示元素:'box' (微型箱線圖)'quartiles' (四分位線)'point' /'stick' (點/線)None (不顯示) |
split | 布爾值 | False | 當使用hue時:True (左右對稱合并)False (獨立顯示) |
dodge | 布爾值 | True | 當使用hue時:True (并排顯示)False (重疊顯示) |
orient | 字符串 | None | 方向:'v' (垂直)'h' (水平)None (自動推斷) |
palette | 字符串/列表 | None | 配色方案(如'viridis' /'Set2' ) |
color | 顏色值 | None | 統一設置所有小提琴顏色 |
width | 浮點數 | 0.8 | 小提琴最大寬度(0~1) |
linewidth | 浮點數 | 1 | 輪廓線寬度(像素) |
cut | 浮點數 | 2 | 數據范圍外的延伸倍數(0=不延伸) |
gridsize | 整數 | 100 | 密度曲線平滑度(值越大越平滑) |
示例代碼
pip install seaborn matplotlib numpy
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np# 設置中文字體支持(如果需要顯示中文)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用黑體顯示中文
plt.rcParams['axes.unicode_minus'] = False # 正常顯示負號# 創建示例數據(替代seaborn內置數據集)
np.random.seed(42)
data = {'Day': np.repeat(['Mon', 'Tue', 'Wed', 'Thu'], 100),'Sales': np.hstack([ # 修改為np.hstacknp.random.normal(120, 20, 100),np.random.normal(80, 15, 100),np.random.normal(150, 30, 100),np.random.normal(95, 25, 100)])
}# 創建圖形
plt.figure(figsize=(10, 6))
ax = sns.violinplot(x='Day',y='Sales',data=data,hue='Day', # 新增hue參數inner='quartile',palette='Pastel1',legend=False # 隱藏圖例
)# 添加標題和標簽
plt.title('每日銷售額分布', fontsize=14)
plt.xlabel('星期', fontsize=12)
plt.ylabel('銷售額 (萬元)', fontsize=12)# 計算并添加中位數注釋
medians = [np.median(data['Sales'][data['Day'] == day]) for day in ['Mon', 'Tue', 'Wed', 'Thu']]
vertical_offset = np.mean(medians) * 0.05 # 偏移量for i, median in enumerate(medians):ax.text(x=i,y=median + vertical_offset,s=f'中位: {median:.1f}',ha='center', # 水平居中va='bottom', # 垂直底部對齊fontsize=10,color='black',weight='bold')# 添加特殊注釋
ax.annotate('最高銷售額區間',xy=(2, 200),xytext=(2.5, 220),arrowprops=dict(arrowstyle='->', color='red', linewidth=1.5),fontsize=12,color='darkred',bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="gray", lw=1))# 添加網格線
plt.grid(axis='y', linestyle='--', alpha=0.7)# 保存高清圖像(支持多種格式:png, jpg, svg, pdf)
plt.savefig('violin_plot.png',dpi=300, # 高分辨率bbox_inches='tight', # 緊湊布局facecolor='white') # 背景色# 顯示圖像(可選)
plt.tight_layout()
plt.show()print("圖像已保存為 violin_plot.png")
3D曲面圖(
繪圖庫介紹
Python繪制3D曲面圖-CSDN博客https://blog.csdn.net/weixin_41923961/article/details/83998917
維度 | 描述 | 典型實現場景 |
---|---|---|
核心作用 | 可視化三維空間中的連續表面 | 理解復雜數學函數、物理現象的空間分布。 |
揭示變量間的非線性關系 | 分析兩個自變量(X, Y)對因變量(Z)的共同影響(尤其非線性關系)。 | |
展示空間數據的分布、趨勢和模式 | 地理高程、物理場(溫度/壓力/電勢)、濃度分布的空間變化。 | |
識別關鍵特征點(峰值、谷值、鞍點) | 定位最大值、最小值、轉折點或急劇變化區域。 | |
實現場景 | 數學與函數可視化 | 繪制二元函數圖像(如?Z = sin(X2+Y2) ),分析函數形狀。 |
地理信息系統 | 地形圖、數字高程模型、坡度分析、洪水模擬。 | |
物理學與工程學 | ? 電磁場:電勢/磁場分布 ? 力學:應力分布、振動模態 ? 流體力學:流速/壓力場 ? 熱力學:溫度場分布 | |
化學與材料科學 | ? 分子建模:電子云密度、勢能面 ? 材料表征:表面粗糙度、成分濃度分布 | |
氣象與海洋學 | ? 氣象:大氣壓力/溫度場 ? 海洋:海水溫度/鹽度垂直剖面 | |
醫學與生物科學 | ? 醫學:器官3D重建(CT/MRI) ? 生物學:蛋白質結構表面、藥物擴散模擬 | |
計算機圖形學 | 渲染復雜3D模型表面(如游戲場景、角色) | |
數據分析 | ? 優化算法:損失函數曲面 ? 響應面分析:多變量對輸出的影響 |
函數簽名(Function Signature)
ax.plot_surface(X, Y, Z, cmap=None, # 顏色映射rstride=1, # 行方向步長cstride=1, # 列方向步長color=None, # 固定顏色edgecolor=None, # 網格線顏色alpha=1.0, # 透明度shade=True, # 是否啟用陰影antialiased=True, # 抗鋸齒norm=None, # 數據歸一化vmin=None, vmax=None # 顏色映射范圍**kwargs)
核心參數詳解表
參數 | 說明 |
---|---|
X, Y, Z | 必需,均為 2D 數組(形狀相同)。通常用?numpy.meshgrid() ?生成 |
cmap | 顏色映射(如?'viridis' ,?'plasma' ,?'coolwarm' ),需配合?facecolors ?或?Z ?值使用 |
rstride ,?cstride | 網格采樣步長(減少可提升性能)。例如?rstride=5 ?表示每隔5行繪制 |
color | 固定曲面顏色(字符串或 RGB 元組),與?cmap ?互斥 |
edgecolor | 網格線顏色(默認?'k' ?黑色),設為?'none' ?可隱藏網格 |
alpha | 透明度(0.0 透明 ~ 1.0 不透明) |
shade | 是否用光照效果增強立體感(默認為?True ) |
antialiased | 是否啟用抗鋸齒(默認為?True ) |
vmin ,?vmax | 顏色映射的數據范圍(配合?cmap ?使用) |
示例代碼
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D# 創建數據
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2)) # 生成曲面數據 (二維sinc函數)# 創建圖形和3D坐標軸
fig = plt.figure(figsize=(12, 10))
ax = fig.add_subplot(111, projection='3d')# 繪制曲面圖
surf = ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8,rstride=2, cstride=2, antialiased=True)# 添加顏色條
fig.colorbar(surf, shrink=0.5, aspect=10, label='Z Value')# 添加全局標題
plt.suptitle('3D Surface Plot with Annotations', fontsize=16)# 添加軸標簽
ax.set_xlabel('X Axis', fontsize=12, labelpad=15)
ax.set_ylabel('Y Axis', fontsize=12, labelpad=15)
ax.set_zlabel('Z Axis', fontsize=12, labelpad=15)# 添加點注解
point = (0, 0, 1) # 要注解的點 (x, y, z)
ax.scatter(*point, color='red', s=100, label='Global Max')
ax.text(point[0], point[1], point[2] + 0.2,'Global Maximum',color='red',fontsize=12,ha='center')# 添加指向局部最小值的箭頭注解
min_point = (-3.5, 3.5, Z[35, 35])
ax.scatter(*min_point, color='blue', s=80)
ax.annotate('Local Minimum',xy=(min_point[0], min_point[1]), # 目標點xytext=(-50, 30), # 文本位置偏移textcoords='offset points',arrowprops=dict(arrowstyle='->', lw=1.5, color='blue'),fontsize=10,color='blue')# 添加圖例
ax.legend(loc='upper right', fontsize=10)# 調整視角
ax.view_init(elev=25, azim=-45) # 仰角25度,方位角-45度# 添加圖形框注釋
fig.text(0.05, 0.02,'Generated by Matplotlib | Function: sin(sqrt(x2 + y2))',fontsize=9, color='gray')# 保存高分辨率圖片
plt.savefig('3d_surface_plot.png', dpi=300, bbox_inches='tight')# 顯示圖形
plt.tight_layout()
plt.show()
地理地圖(Folium/Geopandas)
繪圖庫介紹
Python繪制地圖神器folium介紹及安裝使用教程-CSDN博客https://blog.csdn.net/python2021_/article/details/123652555
函數簽名(Function Signature)
示例代碼
交互式圖表(Plotly/Bokeh)
繪圖庫介紹
函數簽名(Function Signature)
示例代碼
網絡圖(NetworkX)
繪圖庫介紹
函數簽名(Function Signature)
示例代碼
金融圖表(mplfinance)
繪圖庫介紹
函數簽名(Function Signature)
示例代碼
科學可視化(Mayavi)
繪圖庫介紹
函數簽名(Function Signature)
示例代碼
詞云(WordCloud)
繪圖庫介紹
函數簽名(Function Signature)
示例代碼
甘特圖(Plotly)
繪圖庫介紹
函數簽名(Function Signature)