初探 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()

執行結果​​​​​​

​​​​​​​

相关推荐
Python私教1 小时前
0、null、未采集:AI Agent 反馈系统最容易踩的语义坑
人工智能·python
北斗落凡尘1 小时前
LangGraph 入门实战(5)
python·langchain
Python私教1 小时前
请求超时不等于失败:把写操作恢复设计成事实回读
后端·python
且听风吟02202 小时前
7.包管理工具
python
程序员杰哥2 小时前
依赖于第三方接口时,如何进行测试?
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
java修仙传2 小时前
从网页禅道到 AI 能调用的工具:我的禅道 MCP 实现思路分享
java·人工智能·python·ai应用·mcp开发
reasonsummer2 小时前
【办公类-120-01】20260812闵行区幼儿园概况表的数据统计(户籍、五类性质、优抚子女)
前端·python
梦想的旅途22 小时前
企业微信API实战:Python自动化消息推送
java·前端·python·自动化·企业微信
月光船幽幽2 小时前
昆仑流形多模态融合新架构
人工智能·python