初探 Data Analysis - Matplotlib

前言

本篇聚焦 Matplotlib 核心 API plt.plot() 之應用:涵蓋 折線圖(Line Plot)的時間序列趨勢解析,以及散佈圖(Scatter Plot)**的資料分佈與樣式調校實戰。從 StackExchange 取得每種程式語言的貼文總數作為實作資料來源。

matplotlib.pyplot.plot() 語法與參數說明

plt.plot(x, y, fmt, data=None, **kwargs)

參數名稱 資料型態 / 預設值 說明
x, y List / Array / Series 資料的坐標值。 • 支援傳入 List、NumPy Array 或 Pandas Series/Column。 • 若省略 x(僅傳入 y :系統預設自動產生 [0, 1, ..., N-1] 作為 X 軸索引。
fmt str (Format String) 快捷樣式字串。 用簡短代碼一次設定 顏色 (Color)標記 (Marker)線條樣式 (Line Style)範例'r--o' 代表紅色 (r)、虛線 (--)、圓點標記 (o)。
color / c str 線條顏色。 支援顏色名稱或 Hex 色碼(如 'blue', '#FF5733')。
linestyle / ls str 線條樣式。 常見選項:'-' (實線)、'--' (虛線)、':' (點線)、'-.' (點虛線)。
marker str 數據點標記形狀。 常見選項:'o' (圓點)、's' (方塊)、'^' (三角形)、'x' (叉號)。
linewidth / lw float / int 線條寬度 (預設粗細為 1,數值越大線條越粗)。
label str 圖例標籤名稱。 設定後需搭配 plt.legend() 呼叫,才會在圖表上顯示圖例。

測試資料來源

透過在 StackExchange 上執行 SQL 查詢來取得每種程式語言的貼文總數資料

點擊此連結從 [StackExchange](https://data.stackexchange.com/stackoverflow/query/675441/popular-programming-languages-per-over-time-eversql-com "StackExchange")(https://data.stackexchange.com/stackoverflow/query/675441/popular-programming-languages-per-over-time-eversql-com) 執行查詢以取得您自己的 .csv 文件

畫單條線

python 复制代码
xpoints = np.array([1, 8])
ypoints = np.array([3, 10])

# 繪製兩個座標點,而不是一條線,可以使用 o 參數,表示一個實心圈的標記
plt.plot(xpoints, ypoints, 'o')
plt.show()

執行結果​​​​​​

python 复制代码
# 繪製一條不規則線
xpoints = np.array([1, 2, 6, 8])
ypoints = np.array([3, 8, 1, 10])
# marker 可以定義的符號
plt.plot(xpoints, ypoints,marker = '*')
plt.show()

執行結果

範例 programming_posts.csv

Date,Language,Posts

"2008-07-01 00:00:00","c#","3"

"2008-08-01 00:00:00","assembly","8"

"2008-08-01 00:00:00","c","81"

"2008-08-01 00:00:00","c++","164"

"2008-08-01 00:00:00","java","220"

...

...

"2026-07-01 00:00:00","go","4"

"2026-07-01 00:00:00","java","70"

"2026-07-01 00:00:00","javascript","73"

"2026-07-01 00:00:00","perl","6"

"2026-07-01 00:00:00","php","27"

"2026-07-01 00:00:00","python","142"

"2026-07-01 00:00:00","r","54"

"2026-07-01 00:00:00","ruby","2"

"2026-07-01 00:00:00","swift","17"

實作

讀取CSV檔案

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv(csv_path, names=['DATE', 'LANG', 'POSTS'], header=0)
print(f"df.shape: {df.shape}, df.head()顯示前 5 列資料 :\n{df.head()}")

% python3 programming_posts.py

df.shape: (2999, 3), df.head()顯示前 5 列資料 :

DATE LANG POSTS

0 2008-07-01 00:00:00 c# 3

1 2008-08-01 00:00:00 assembly 8

2 2008-08-01 00:00:00 c 81

3 2008-08-01 00:00:00 c# 503

4 2008-08-01 00:00:00 c++ 164

python 复制代码
# 日期轉換
df["DATE"] = pd.to_datetime(
    df["DATE"]
)


# 把 Language 變成 Columns
pivot_df = df.pivot(
    index="DATE",
    columns="LANG",
    values="POSTS"
)

# fillna() 用常數 0 填入所有缺失值.傳回一個新的 DataFrame(如果 inplace=False),或 None(如果 inplace=True)
pivot_df.fillna(
    0,
    inplace=True
)


# 繪製折線圖
plt.plot(pivot_df.index, pivot_df.java, label="java")
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.xlabel('DATE', fontsize=14)
plt.ylabel('Number of Posts', fontsize=14)
plt.ylim(0, 35000)
plt.legend(fontsize=14)

plt.show()

執行結果​​​​​​

python 复制代码
# 繪製各語言貼文折線圖
plt.figure(figsize=(15,8))

for column in pivot_df.columns:
    plt.plot(
        pivot_df.index,
        pivot_df[column],
        label=column
    )

plt.legend()
plt.title("Programming Language Trend")

plt.xlabel("Date")
plt.ylabel("Posts")

plt.show()

執行結果​​​​​​

python 复制代码
# Rolling Mean 三個月平均
rolling_df = pivot_df.rolling(
    window=3
).mean()
plt.figure(figsize=(18,9))
for column in rolling_df.columns:
    plt.plot(
        rolling_df.index,
        rolling_df[column],
        linewidth=3,
        label=column
    )

plt.legend()
plt.grid()
plt.xlabel("Year")
plt.ylabel("Average Posts")
plt.title("3-Month Rolling Average")
plt.tight_layout()
plt.show()

執行結果​​​​​​

​​​​​​​

相关推荐
默_笙7 小时前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
qq_426003968 小时前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫8 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技8 小时前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读8 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时9 小时前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
奇思妙想聪明勤奋的小羊10 小时前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd12310 小时前
2026年第38周GitHub趋势周报
python·科技·github
IZero0710 小时前
Jev 与 Laya
python·语言模型