折線圖是數據可視化中最常用的圖表類型之一,適用于展示數據隨時間或有序類別變化的趨勢。無論是分析銷售額波動、溫度變化,還是對比多組數據的趨勢差異,折線圖都能直觀呈現數據的變化規律。本文將詳細介紹如何用 Python 的 Matplotlib、Seaborn 和 Plotly 庫繪制各類折線圖,從基礎到進階,覆蓋常見場景及定制技巧。
一、準備工作:環境與工具
在開始繪圖前,需確保安裝必要的庫,并解決中文顯示問題(避免標題 / 標簽亂碼)。
1. 安裝依賴庫
常用的折線圖繪制庫包括:
- Matplotlib:Python 最基礎的繪圖庫,功能全面,可高度定制;
- Seaborn:基于 Matplotlib 的高級封裝,風格更美觀,適合統計可視化;
- Plotly:交互式繪圖庫,支持動態交互(懸停、縮放等)。
?安裝命令:
pip install matplotlib seaborn plotly pandas numpy
2. 全局設置(解決中文顯示問題)
Matplotlib 默認不支持中文,需提前配置字體:
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd# 設置中文顯示
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"] # 支持中文
plt.rcParams["axes.unicode_minus"] = False # 解決負號顯示問題
sns.set(font_scale=1.2) # Seaborn字體縮放
二、基礎折線圖:單條與多條數據
1. 單條折線圖
適用于展示一組數據的變化趨勢(如某產品月度銷量)。
示例代碼:
# 生成數據:x為月份,y為銷量
x = np.arange(1, 13) # 1-12月
y = np.random.randint(50, 150, size=12) # 隨機生成50-150的銷量# 創建畫布
plt.figure(figsize=(10, 6)) # 畫布大小(寬, 高)# 繪制折線圖
plt.plot(x, y, # x軸、y軸數據color='skyblue', # 線條顏色marker='o', # 數據點標記(圓形)linestyle='-', # 線條樣式(實線)linewidth=2, # 線條寬度markersize=6) # 標記大小# 添加標題和標簽
plt.title('2023年某產品月度銷量趨勢', fontsize=15)
plt.xlabel('月份', fontsize=12)
plt.ylabel('銷量(件)', fontsize=12)# 設置x軸刻度(1-12月)
plt.xticks(x)# 添加網格線(輔助閱讀)
plt.grid(alpha=0.3) # alpha控制透明度# 顯示圖表
plt.show()
關鍵技巧:通過label
參數定義每條線的名稱,用plt.legend()
顯示圖例;用不同顏色、標記區分多條線,提升可讀性。
三、進階折線圖:應對復雜場景
1. 帶誤差線的折線圖
當數據存在波動范圍(如實驗重復的標準差)時,誤差線可直觀展示數據的可靠性。
示例代碼:
# 生成數據(模擬實驗數據)
x = np.arange(1, 11) # 實驗次數
y = np.random.normal(50, 10, 10) # 均值50,標準差10的隨機數據
error = np.random.uniform(2, 5, 10) # 誤差范圍(2-5)plt.figure(figsize=(10, 6))# 繪制帶誤差線的折線圖
plt.errorbar(x, y, yerr=error, # y方向誤差fmt='-o', # 線條樣式(-實線+o標記)ecolor='gray', # 誤差線顏色elinewidth=1, # 誤差線寬度capsize=3) # 誤差線末端橫線長度plt.title('實驗數據趨勢與誤差范圍', fontsize=15)
plt.xlabel('實驗次數', fontsize=12)
plt.ylabel('測量值', fontsize=12)
plt.grid(alpha=0.3)
plt.show()
效果:折線中每個數據點都帶有上下誤差線,清晰展示數據的波動范圍。
2. 時間序列折線圖
時間序列數據(如每日氣溫、每周銷售額)的 x 軸為日期,需特殊處理日期格式。
示例代碼:
import pandas as pd# 生成時間序列數據(2023年1-3月,共90天)
dates = pd.date_range(start='2023-01-01', end='2023-03-31', freq='D')
values = np.random.randint(10, 30, size=len(dates)) # 模擬每日溫度(10-30℃)plt.figure(figsize=(14, 6))# 繪制時間序列折線圖
plt.plot(dates, values, color='orange', linewidth=1.5)# 格式化x軸日期(避免重疊)
plt.gcf().autofmt_xdate() # 自動旋轉日期標簽
plt.xlabel('日期', fontsize=12)
plt.ylabel('溫度(℃)', fontsize=12)
plt.title('2023年1-3月每日溫度趨勢', fontsize=15)
plt.grid(alpha=0.3)
plt.show()
關鍵技巧:用pandas.date_range
生成日期序列;通過plt.gcf().autofmt_xdate()
自動旋轉 x 軸日期標簽,避免文字重疊。
3. 雙 Y 軸折線圖
當兩組數據量級差異大(如 “銷售額” 和 “訂單量”)時,雙 Y 軸可避免其中一組數據趨勢被壓縮。
示例代碼:
# 生成數據(量級差異大的兩組數據)
x = np.arange(1, 13) # 月份
y1 = np.random.randint(1000, 5000, 12) # 銷售額(千級)
y2 = np.random.randint(20, 80, 12) # 訂單量(十級)# 創建畫布和第一個Y軸
fig, ax1 = plt.subplots(figsize=(12, 6))# 繪制第一組數據(銷售額)
ax1.plot(x, y1, color='blue', label='銷售額')
ax1.set_xlabel('月份', fontsize=12)
ax1.set_ylabel('銷售額(元)', color='blue', fontsize=12)
ax1.tick_params(axis='y', labelcolor='blue') # Y軸標簽顏色# 創建第二個Y軸(共享X軸)
ax2 = ax1.twinx()
ax2.plot(x, y2, color='red', label='訂單量')
ax2.set_ylabel('訂單量(單)', color='red', fontsize=12)
ax2.tick_params(axis='y', labelcolor='red')# 合并圖例
lines1, labels1 = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left')plt.title('月度銷售額與訂單量趨勢', fontsize=15)
plt.grid(alpha=0.3)
plt.show()
效果:左側 Y 軸展示銷售額(千級),右側 Y 軸展示訂單量(十級),兩組數據趨勢均清晰可見。
4. 填充區域折線圖
在折線下方填充顏色,可增強數據的視覺聚焦效果(如突出累積趨勢)。
示例代碼:
# 生成數據(累積增長趨勢)
x = np.arange(1, 11)
y = np.cumsum(np.random.randint(5, 15, 10)) # 累積求和(模擬用戶增長)plt.figure(figsize=(10, 6))# 繪制折線并填充下方區域
plt.plot(x, y, color='purple', linewidth=2)
plt.fill_between(x, y, # x范圍、y上限(折線)、y下限(0)color='purple', alpha=0.2) # 透明度(0-1)plt.title('產品用戶累積增長趨勢', fontsize=15)
plt.xlabel('上線月份', fontsize=12)
plt.ylabel('累積用戶數', fontsize=12)
plt.grid(alpha=0.3)
plt.show()
效果:折線下方被半透明紫色填充,突出數據的累積增長趨勢。
四、交互式折線圖(Plotly)
靜態折線圖無法交互,而 Plotly 可生成支持懸停查看數據、縮放、平移的動態圖表,適合網頁展示。
示例代碼:
import plotly.express as px# 生成數據(多組產品銷量)
df = pd.DataFrame({'月份': np.arange(1, 13),'產品A': np.random.randint(50, 100, 12),'產品B': np.random.randint(80, 150, 12),'產品C': np.random.randint(30, 80, 12)
})# 轉換為長格式(適合Plotly)
df_long = df.melt('月份', var_name='產品', value_name='銷量')# 繪制交互式折線圖
fig = px.line(df_long, x='月份', y='銷量', color='產品', # 按產品區分線條title='2023年三大產品月度銷量趨勢(交互式)',markers=True) # 顯示數據點標記# 顯示圖表(自動打開瀏覽器/IDE內置窗口)
fig.show()
交互功能:
- 懸停在數據點上可查看具體數值(月份、產品、銷量);
- 點擊圖例可隱藏 / 顯示對應產品的折線;
- 支持縮放(鼠標滾輪)、平移(拖拽)、下載圖片。
五、總結
折線圖是展示趨勢的核心工具,Python 的 Matplotlib、Seaborn 和 Plotly 庫可滿足不同需求:
- 基礎靜態圖:用 Matplotlib,靈活定制樣式;
- 統計風格圖:用 Seaborn,默認風格更美觀;
- 交互式圖表:用 Plotly,適合動態探索數據。
實際應用中,需根據數據特點選擇合適的折線圖類型:對比多組數據用多條折線,展示波動用誤差線,處理時間數據用時間序列圖,量級差異大用雙 Y 軸。通過合理定制樣式(顏色、標記、標簽),可讓折線圖更直觀地傳遞數據信息。