最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python數(shù)據(jù)可視化Matplotlib從入門到精通

 更新時間:2026年06月01日 09:22:17   作者:河阿里  
Matplotlib 是 Python 中一個非常強大的數(shù)據(jù)可視化庫,它可以幫助你創(chuàng)建各種靜態(tài)、動態(tài)和交互式的圖表,下面給大家介紹Python數(shù)據(jù)可視化Matplotlib從入門到精通,感興趣的朋友跟隨小編一起看看吧

一、核心架構(gòu)

1.1 四大核心組件

  • Figure(畫布):整個圖形窗口,可以包含一個或多個Axes。
  • Axes(坐標(biāo)系/子圖):實際繪圖的區(qū)域,包含數(shù)據(jù)空間、坐標(biāo)軸、圖例等。(最核心的操作對象)
  • Axis(坐標(biāo)軸):控制數(shù)據(jù)限制、刻度(Ticks)和刻度標(biāo)簽。
  • Artist(藝術(shù)家):圖表中所有可見元素的基類(如Line2D、Text、Rectangle)。

1.2 狀態(tài)機 API vs 面向?qū)ο?API

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 狀態(tài)機 API (不推薦用于復(fù)雜項目)
plt.figure()
plt.plot(x, y)
plt.title("Sine Wave")
plt.show()
# 面向?qū)ο?API (強烈推薦,邏輯清晰,易于控制)
fig, ax = plt.subplots(figsize=(8, 5))  # 創(chuàng)建畫布和坐標(biāo)系
ax.plot(x, y, label="Sine")             # 在指定的ax上繪圖
ax.set_title("Sine Wave")               # 設(shè)置屬性
ax.legend()
plt.show()

二、全局配置

在開始繪圖前,配置好全局參數(shù)可以節(jié)省大量重復(fù)代碼,尤其是中文顯示統(tǒng)一風(fēng)格

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import pandas as pd
# ==========================================
# 全局參數(shù)設(shè)置 (rcParams)
# ==========================================
# 1. 解決中文顯示問題 (Windows/Mac通用方案)
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'Microsoft YaHei'] # 支持黑體/蘋方/微軟雅黑
plt.rcParams['axes.unicode_minus'] = False  # 正常顯示負號
# 2. 提升圖表默認顏值
plt.rcParams['figure.dpi'] = 120            # 提高默認分辨率
plt.rcParams['axes.spines.top'] = False     # 隱藏頂部邊框
plt.rcParams['axes.spines.right'] = False   # 隱藏右側(cè)邊框
plt.rcParams['axes.grid'] = True            # 默認開啟網(wǎng)格
plt.rcParams['grid.alpha'] = 0.3            # 網(wǎng)格線透明度
plt.rcParams['grid.linestyle'] = '--'       # 網(wǎng)格線型
# 3. 使用內(nèi)置高級樣式 (可選)
# plt.style.use('seaborn-v0_8-whitegrid') # 類似Seaborn的清爽風(fēng)格
# plt.style.use('ggplot')                 # R語言ggplot2風(fēng)格

三、六大圖表匯總

3.1 折線圖 (Line Plot) -趨勢分析

場景:時間序列數(shù)據(jù)、指標(biāo)走勢。

fig, ax = plt.subplots(figsize=(10, 6))
months = np.arange(1, 13)
sales_A = np.random.randint(100, 300, 12)
sales_B = np.random.randint(150, 350, 12)
# 繪制折線,控制顏色、線型、標(biāo)記
ax.plot(months, sales_A, color='#1f77b4', marker='o', linewidth=2, markersize=6, label='產(chǎn)品A')
ax.plot(months, sales_B, color='#ff7f0e', marker='s', linewidth=2, markersize=6, linestyle='--', label='產(chǎn)品B')
# 填充兩條線之間的區(qū)域 (突出差異)
ax.fill_between(months, sales_A, sales_B, where=(sales_A > sales_B), color='blue', alpha=0.1, interpolate=True)
ax.set_xticks(months)
ax.set_xticklabels([f"{m}月" for m in months])
ax.set_ylabel("銷售額 (萬元)")
ax.set_title("2025年各產(chǎn)品線月度銷售趨勢", fontsize=16, fontweight='bold', pad=15)
ax.legend(loc='upper left', frameon=False) # 去除圖例邊框
plt.tight_layout()
plt.show()

3.2 散點圖 (Scatter Plot) -相關(guān)性與聚類分析

場景:探究兩個連續(xù)變量的關(guān)系,結(jié)合顏色和大小引入第三、第四維度。

fig, ax = plt.subplots(figsize=(9, 7))
np.random.seed(42)
x = np.random.randn(200)
y = 2.5 * x + np.random.randn(200) * 1.5
colors = np.random.rand(200)  # 顏色映射
sizes = np.random.rand(200) * 500  # 氣泡大小
# 使用 cmap 映射顏色,alpha 控制透明度
scatter = ax.scatter(x, y, c=colors, s=sizes, alpha=0.6, cmap='viridis', edgecolors='w', linewidth=0.5)
# 添加顏色條 (Colorbar)
cbar = fig.colorbar(scatter, ax=ax)
cbar.set_label("用戶活躍度指數(shù)", rotation=270, labelpad=15)
ax.set_xlabel("廣告投入 (萬元)")
ax.set_ylabel("轉(zhuǎn)化率 (%)")
ax.set_title("廣告投入與轉(zhuǎn)化率關(guān)系分析 (氣泡大小代表客單價)")
plt.show()

3.3 柱狀圖 (Bar Chart) -分類對比

場景:離散類別的數(shù)值對比(注意:時間序列不要用柱狀圖,用折線圖)。

fig, ax = plt.subplots(figsize=(10, 6))
categories = ['華北', '華東', '華南', '西南', '西北']
q1_sales = [120, 150, 130, 90, 70]
q2_sales = [135, 160, 145, 100, 85]
x = np.arange(len(categories))
width = 0.35
bars1 = ax.bar(x - width/2, q1_sales, width, label='Q1季度', color='#4C72B0', edgecolor='white')
bars2 = ax.bar(x + width/2, q2_sales, width, label='Q2季度', color='#DD8452', edgecolor='white')
# 數(shù)據(jù)標(biāo)簽自動化 (分析師必備技巧)
def add_labels(bars):
    for bar in bars:
        height = bar.get_height()
        ax.annotate(f'{height}',
                    xy=(bar.get_x() + bar.get_width() / 2, height),
                    xytext=(0, 3),  # 3 points vertical offset
                    textcoords="offset points",
                    ha='center', va='bottom', fontsize=10)
add_labels(bars1)
add_labels(bars2)
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.set_ylabel("營收 (百萬)")
ax.set_title("各大區(qū)Q1與Q2營收對比")
ax.legend()
plt.show()

3.4 直方圖與密度圖 (Histogram & KDE) -數(shù)據(jù)分布

場景:連續(xù)變量的分布形態(tài)、偏態(tài)、峰度分析。

fig, ax = plt.subplots(figsize=(10, 6))
# 生成偏態(tài)分布數(shù)據(jù)
data = np.random.lognormal(mean=2.0, sigma=0.8, size=1000)
# 繪制直方圖 (density=True 使其與密度曲線y軸對齊)
ax.hist(data, bins=50, density=True, alpha=0.6, color='skyblue', edgecolor='black', label='頻數(shù)分布')
# 疊加核密度估計曲線 (KDE) - 需借助scipy
from scipy.stats import gaussian_kde
density = gaussian_kde(data)
x_vals = np.linspace(0, np.max(data), 200)
ax.plot(x_vals, density(x_vals), color='red', linewidth=2, label='KDE密度曲線')
# 添加均值和中位數(shù)輔助線
mean_val, median_val = np.mean(data), np.median(data)
ax.axvline(mean_val, color='green', linestyle='--', label=f'均值: {mean_val:.2f}')
ax.axvline(median_val, color='purple', linestyle='-.', label=f'中位數(shù): {median_val:.2f}')
ax.set_xlabel("用戶停留時長 (秒)")
ax.set_ylabel("概率密度")
ax.set_title("用戶APP停留時長分布 (右偏分布)")
ax.legend()
plt.show()

3.5 箱線圖 (Boxplot) -異常值檢測與多組分布對比

場景:快速查看數(shù)據(jù)的四分位數(shù)、IQR及離群點。

fig, ax = plt.subplots(figsize=(10, 6))
# 模擬不同部門的薪資數(shù)據(jù) (包含異常值)
data = [
    np.random.normal(15000, 3000, 100).tolist() + [35000, 40000], # 研發(fā)部
    np.random.normal(10000, 2000, 100).tolist() + [25000],        # 市場部
    np.random.normal(8000, 1500, 100).tolist() + [5000, 18000]    # 運營部
]
bp = ax.boxplot(data, patch_artist=True, labels=['研發(fā)部', '市場部', '運營部'],
                showmeans=True, # 顯示均值點
                meanprops={"marker":"D", "markerfacecolor":"red", "markersize":8}) # 均值樣式
# 自定義箱體顏色
colors = ['#8DD3C7', '#FFFFB3', '#BEBADA']
for patch, color in zip(bp['boxes'], colors):
    patch.set_facecolor(color)
ax.set_ylabel("月薪 (元)")
ax.set_title("各部門薪資分布與異常值檢測")
plt.show()

四、圖表細節(jié)打磨

優(yōu)秀的圖表應(yīng)該做到“Data-Ink Ratio(數(shù)據(jù)墨水比)”最大化,去除冗余元素,突出重點。

4.1 高亮特定數(shù)據(jù)點與注釋

fig, ax = plt.subplots(figsize=(10, 6))
x = np.arange(2015, 2025)
y = [12, 15, 13, 18, 22, 19, 25, 30, 28, 45] # 2024年有突破
# 默認灰色線條
ax.plot(x, y, color='lightgray', marker='o', linewidth=2, markersize=8, zorder=2)
# 高亮最大值
max_idx = np.argmax(y)
ax.plot(x[max_idx], y[max_idx], color='red', marker='o', markersize=12, zorder=3)
# 添加帶箭頭的注釋
ax.annotate(f'歷史峰值: {y[max_idx]}M', 
            xy=(x[max_idx], y[max_idx]), 
            xytext=(x[max_idx]-2, y[max_idx]+5),
            arrowprops=dict(facecolor='black', arrowstyle='->', lw=1.5),
            fontsize=12, fontweight='bold', color='red')
# 添加背景水印或數(shù)據(jù)來源說明
ax.text(0.98, 0.02, '數(shù)據(jù)來源: 內(nèi)部BI系統(tǒng)', transform=ax.transAxes,
        fontsize=9, color='gray', ha='right', va='bottom', alpha=0.7)
ax.set_title("公司年度營收增長趨勢 (2015-2024)")
plt.show()

4.2 自定義坐標(biāo)軸刻度與格式化

在金融或商業(yè)數(shù)據(jù)中,經(jīng)常需要格式化Y軸(如加單位、百分比、千分位)。

from matplotlib.ticker import FuncFormatter, MultipleLocator
fig, ax = plt.subplots(figsize=(10, 6))
x = np.arange(10)
y = [1250000, 1450000, 1300000, 1800000, 2200000, 1950000, 2500000, 3000000, 2800000, 4500000]
ax.bar(x, y, color='steelblue')
# 自定義Y軸格式化函數(shù) (轉(zhuǎn)為"萬"單位)
def format_y(value, tick_number):
    return f'{value / 10000:.0f}萬'
ax.yaxis.set_major_formatter(FuncFormatter(format_y))
# 設(shè)置Y軸刻度間隔
ax.yaxis.set_major_locator(MultipleLocator(1000000))
ax.set_xticks(x)
ax.set_title("Y軸自定義格式化示例")
plt.show()

五、多子圖與復(fù)雜儀表盤

5.1 規(guī)則多子圖 (plt.subplots)

# 創(chuàng)建 2x2 的網(wǎng)格,共享X軸或Y軸
fig, axes = plt.subplots(2, 2, figsize=(12, 10), sharex=True, sharey=True)
# 扁平化axes數(shù)組以便循環(huán)
for i, ax in enumerate(axes.flatten()):
    x = np.random.randn(100)
    y = np.random.randn(100)
    ax.scatter(x, y, alpha=0.6)
    ax.set_title(f'子圖 {i+1}')
fig.suptitle("多子圖共享坐標(biāo)軸示例", fontsize=16, y=1.02)
plt.tight_layout()
plt.show()

5.2 復(fù)雜不規(guī)則布局 (GridSpec)

場景:制作Dashboard儀表盤,例如左側(cè)一個大圖,右側(cè)上下兩個小圖。

import matplotlib.gridspec as gridspec
fig = plt.figure(figsize=(14, 8))
# 定義 3行3列 的網(wǎng)格
gs = gridspec.GridSpec(3, 3, figure=fig, hspace=0.3, wspace=0.3)
# 左側(cè)大圖占據(jù) 3行2列
ax_main = fig.add_subplot(gs[:, :2]) 
# 右上小圖
ax_top_right = fig.add_subplot(gs[0, 2])
# 右中
ax_mid_right = fig.add_subplot(gs[1, 2])
# 右下
ax_bot_right = fig.add_subplot(gs[2, 2])
# 繪制數(shù)據(jù)
x = np.linspace(0, 10, 100)
ax_main.plot(x, np.sin(x), 'b-', linewidth=2)
ax_main.set_title("主視圖:正弦波")
ax_top_right.bar(['A','B','C'], [10, 20, 15], color='coral')
ax_top_right.set_title("分類統(tǒng)計")
ax_mid_right.hist(np.random.randn(200), bins=20, color='lightgreen', edgecolor='black')
ax_mid_right.set_title("分布直方圖")
ax_bot_right.pie([30, 40, 30], labels=['X','Y','Z'], autopct='%1.1f%%', colors=['#ff9999','#66b3ff','#99ff99'])
ax_bot_right.set_title("占比分析")
plt.show()

六、雙Y軸、3D圖與交互

6.1 雙Y軸圖表 (Twinx)

場景:兩個量綱不同但具有相關(guān)性的指標(biāo)(如:溫度與冰淇淋銷量,價格與銷量)。

fig, ax1 = plt.subplots(figsize=(10, 6))
months = np.arange(1, 13)
temperature = [5, 8, 12, 18, 24, 28, 32, 31, 26, 19, 12, 6]
ice_cream_sales = [10, 15, 25, 45, 80, 120, 150, 145, 90, 50, 20, 12]
# 左Y軸 (溫度)
color1 = 'tab:red'
ax1.set_xlabel('月份')
ax1.set_ylabel('平均氣溫 (°C)', color=color1)
ax1.plot(months, temperature, color=color1, marker='o', label='氣溫')
ax1.tick_params(axis='y', labelcolor=color1)
# 實例化第二個Y軸
ax2 = ax1.twinx()  
color2 = 'tab:blue'
ax2.set_ylabel('冰淇淋銷量 (箱)', color=color2)  
ax2.bar(months, ice_cream_sales, color=color2, alpha=0.4, label='銷量')
ax2.tick_params(axis='y', labelcolor=color2)
# 合并圖例 (重要技巧)
lines_1, labels_1 = ax1.get_legend_handles_labels()
lines_2, labels_2 = ax2.get_legend_handles_labels()
ax1.legend(lines_1 + lines_2, labels_1 + labels_2, loc='upper left')
plt.title("氣溫與冰淇淋銷量相關(guān)性分析 (雙Y軸)")
fig.tight_layout()
plt.show()

6.2 3D曲面圖

場景:數(shù)學(xué)建模、損失函數(shù)可視化、三維地形。

from mpl_toolkits.mplot3d import Axes3D # 導(dǎo)入3D工具包
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
# 定義一個復(fù)雜的3D函數(shù) (如Sinc函數(shù)變形)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R) / (R + 0.1)
# 繪制3D曲面
surf = ax.plot_surface(X, Y, Z, cmap='coolwarm', edgecolor='none', alpha=0.9)
# 添加顏色條
fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, label='Z Value')
ax.set_zlabel('Z Axis')
ax.set_title("3D Surface Plot")
plt.show()

七、我的建議

7.1 圖表保存規(guī)范

在撰寫報告或發(fā)表論文時,圖片的格式和分辨率至關(guān)重要。

# 保存為矢量圖 (PDF/SVG) - 論文、PPT首選,無限放大不失真
fig.savefig('report_chart.pdf', format='pdf', bbox_inches='tight')
# 保存為高分辨率位圖 (PNG) - 網(wǎng)頁、公眾號文章首選
fig.savefig('web_chart.png', format='png', dpi=300, bbox_inches='tight', facecolor='white')

注:bbox_inches='tight' 可自動裁剪多余的白邊,防止標(biāo)簽被截斷。

7.2 與 Pandas / Seaborn 的無縫協(xié)作

作為分析師,不要從頭手寫所有基礎(chǔ)統(tǒng)計圖。Pandas負責(zé)快速探索,Seaborn負責(zé)統(tǒng)計美學(xué),Matplotlib負責(zé)最終微調(diào)。

import seaborn as sns
# 使用Seaborn繪制復(fù)雜的統(tǒng)計圖
fig, ax = plt.subplots(figsize=(10, 6))
tips = sns.load_dataset("tips")
# Seaborn綁定到Matplotlib的ax上
sns.violinplot(x="day", y="total_bill", hue="smoker", data=tips, split=True, ax=ax, palette="Set2")
# 使用Matplotlib的API進行細節(jié)微調(diào)
ax.set_title("Seaborn與Matplotlib結(jié)合使用", fontsize=14)
ax.set_xlabel("星期")
ax.set_ylabel("賬單總額")
sns.despine(ax=ax) # 移除上右邊框
plt.show()

7.3 避坑指南 (Troubleshooting)

  1. 中文亂碼變方塊:99%是因為系統(tǒng)缺少字體或緩存未更新。
    • 解決:刪除 ~/.matplotlib/fontlist-*.json 緩存文件,重啟Jupyter/IDE。
  2. 圖表元素被遮擋
    • 解決:利用 zorder 參數(shù)控制圖層順序(數(shù)值越大越靠上層)。
  3. Jupyter Notebook中不顯示
    • 解決:確保在文件開頭添加了 %matplotlib inline%matplotlib widget(支持交互式縮放)。
  4. 餅圖的誤導(dǎo)性
    • 建議:人眼對面積和角度的敏感度遠低于長度。超過5個分類時,堅決用條形圖替代餅圖。

到此這篇關(guān)于Python數(shù)據(jù)可視化Matplotlib從入門到精通的文章就介紹到這了,更多相關(guān)Python 數(shù)據(jù)可視化Matplotlib內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python調(diào)用短信貓控件實現(xiàn)發(fā)短信功能實例

    python調(diào)用短信貓控件實現(xiàn)發(fā)短信功能實例

    這篇文章主要介紹了python調(diào)用短信貓控件實現(xiàn)發(fā)短信功能實例,需要的朋友可以參考下
    2014-07-07
  • python自定義封裝帶顏色的logging模塊

    python自定義封裝帶顏色的logging模塊

    大家好,本篇文章主要講的是python自定義封裝帶顏色的logging模塊,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • Python?Rich增加終端顯示視覺效果

    Python?Rich增加終端顯示視覺效果

    Python開發(fā)中,命令行界面(CLI)經(jīng)常被用于交互和數(shù)據(jù)展示,雖然命令行界面通常被視為簡單、枯燥的文本顯示區(qū)域,通過Python的Rich庫,為命令行界面帶來更多生機和視覺吸引力,本文帶大家探索Rich功能強大的Python庫,增強終端文本渲染,使輸出更具有吸引力和可讀性
    2024-01-01
  • Python如何使用bokeh包和geojson數(shù)據(jù)繪制地圖

    Python如何使用bokeh包和geojson數(shù)據(jù)繪制地圖

    這篇文章主要介紹了Python如何使用bokeh包和geojson數(shù)據(jù)繪制地圖,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • PyTorch之怎樣選擇合適的優(yōu)化器和損失函數(shù)

    PyTorch之怎樣選擇合適的優(yōu)化器和損失函數(shù)

    這篇文章主要介紹了PyTorch怎樣選擇合適的優(yōu)化器和損失函數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • PyQt4 treewidget 選擇改變顏色,并設(shè)置可編輯的方法

    PyQt4 treewidget 選擇改變顏色,并設(shè)置可編輯的方法

    今天小編就為大家分享一篇PyQt4 treewidget 選擇改變顏色,并設(shè)置可編輯的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • python協(xié)程用法實例分析

    python協(xié)程用法實例分析

    這篇文章主要介紹了python協(xié)程用法,實例分析Python中協(xié)議的概念、功能及使用方法,需要的朋友可以參考下
    2015-06-06
  • 20個Python中正則表達式的應(yīng)用與技巧小結(jié)

    20個Python中正則表達式的應(yīng)用與技巧小結(jié)

    正則表達式是一種用來匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,本文我們將探討?Python?中?re?模塊的應(yīng)用和一些技巧,希望可以幫助您更好地理解和利用正則表達式
    2024-04-04
  • 使用Python刪除文本文件中特定行的操作方法

    使用Python刪除文本文件中特定行的操作方法

    文件操作是編程中的重要方面,Python作為強大的編程語言,提供了處理文件的能力,刪除特定行是文件處理中常見的需求,本文給大家介紹了Python快速刪除文本文件中指定行的方法,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2023-12-12
  • Python 二叉樹的層序建立與三種遍歷實現(xiàn)詳解

    Python 二叉樹的層序建立與三種遍歷實現(xiàn)詳解

    這篇文章主要介紹了Python 二叉樹的層序建立與三種遍歷實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07

最新評論

屯昌县| 涡阳县| 淮滨县| 沾化县| 长岭县| 保靖县| 曲靖市| 高碑店市| 固原市| 石楼县| 库车县| 楚雄市| 图片| 阆中市| 原阳县| 江源县| 独山县| 扎囊县| 勃利县| 镇巴县| 湘阴县| 石林| 乐至县| 密山市| 丹寨县| 阳信县| 航空| 丽江市| 托克托县| 壤塘县| 定西市| 灯塔市| 鹤壁市| 三原县| 遵化市| 周口市| 汕头市| 岳池县| 旬邑县| 安塞县| 威远县|