Python+matplotlib繪制常見(jiàn)圖表的入門(mén)教程
引言
對(duì)于剛開(kāi)始學(xué)習(xí) Python 數(shù)據(jù)分析的同學(xué)來(lái)說(shuō),數(shù)據(jù)可視化是非常重要的一步。很多時(shí)候,表格中的數(shù)字并不直觀,但只要畫(huà)成圖表,就能快速看出趨勢(shì)、對(duì)比關(guān)系和占比結(jié)構(gòu)。
本文將以 matplotlib 為核心,帶你完成常見(jiàn)圖表繪制,包括折線圖、柱狀圖、餅圖、中文亂碼解決、標(biāo)題和坐標(biāo)軸設(shè)置,以及從 Excel 中讀取數(shù)據(jù)并繪圖。文章中的代碼都適合初學(xué)者直接運(yùn)行和修改。
一、matplotlib 庫(kù)介紹
matplotlib 是 Python 中最常用的數(shù)據(jù)可視化庫(kù)之一,尤其適合繪制二維圖表。它可以繪制折線圖、柱狀圖、散點(diǎn)圖、餅圖、直方圖等常見(jiàn)統(tǒng)計(jì)圖,也可以對(duì)圖表標(biāo)題、坐標(biāo)軸、圖例、顏色、字體、網(wǎng)格線等進(jìn)行細(xì)致控制。
在 Python 數(shù)據(jù)分析中,matplotlib 經(jīng)常和下面這些庫(kù)一起使用:
numpy:用于數(shù)值計(jì)算pandas:用于讀取和處理表格數(shù)據(jù)matplotlib:用于把數(shù)據(jù)繪制成圖表
安裝方式如下:
pip install matplotlib pandas openpyxl
其中:
matplotlib用來(lái)繪圖pandas用來(lái)讀取 Excel 或 CSV 數(shù)據(jù)openpyxl用來(lái)支持pandas讀取.xlsx文件
在代碼中,一般這樣導(dǎo)入:
import matplotlib.pyplot as plt
pyplot 是 matplotlib 中最常用的繪圖接口,初學(xué)階段重點(diǎn)掌握它即可。
二、解決 matplotlib 中文亂碼問(wèn)題
很多初學(xué)者第一次使用 matplotlib 繪圖時(shí),會(huì)遇到中文標(biāo)題顯示為方塊、亂碼,或者負(fù)號(hào)顯示異常的問(wèn)題。
可以在代碼開(kāi)頭統(tǒng)一添加下面兩行配置:
import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"] = ["SimHei"] plt.rcParams["axes.unicode_minus"] = False
說(shuō)明:
SimHei是 Windows 系統(tǒng)中常見(jiàn)的黑體字體axes.unicode_minus = False用來(lái)解決負(fù)號(hào)顯示異常的問(wèn)題
如果你使用 macOS,可以嘗試:
plt.rcParams["font.sans-serif"] = ["Arial Unicode MS"]
如果你使用 Linux,可以安裝中文字體后再配置對(duì)應(yīng)字體名稱(chēng),例如 Noto Sans CJK SC。
三、繪制折線圖
折線圖適合展示數(shù)據(jù)隨時(shí)間或順序變化的趨勢(shì),例如每天銷(xiāo)售額、每月用戶數(shù)、溫度變化等。
下面的例子繪制一組“每月銷(xiāo)售額”數(shù)據(jù):
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
months = ["1月", "2月", "3月", "4月", "5月", "6月"]
sales = [12000, 15000, 18000, 16000, 21000, 26000]
plt.figure(figsize=(8, 5))
plt.plot(months, sales, marker="o", color="blue", linewidth=2, label="銷(xiāo)售額")
plt.title("上半年銷(xiāo)售額趨勢(shì)")
plt.xlabel("月份")
plt.ylabel("銷(xiāo)售額(元)")
plt.legend()
plt.grid(True, linestyle="--", alpha=0.5)
plt.show()
常用參數(shù)說(shuō)明:
marker="o":給每個(gè)數(shù)據(jù)點(diǎn)添加圓點(diǎn)標(biāo)記color="blue":設(shè)置折線顏色linewidth=2:設(shè)置線條寬度label="銷(xiāo)售額":設(shè)置圖例文字plt.legend():顯示圖例plt.grid():顯示網(wǎng)格線
四、繪制柱狀圖
柱狀圖適合比較不同類(lèi)別之間的數(shù)值大小,例如不同產(chǎn)品銷(xiāo)量、不同城市訂單數(shù)、不同部門(mén)收入等。
下面的例子繪制“不同產(chǎn)品銷(xiāo)量”柱狀圖:
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
products = ["手機(jī)", "電腦", "耳機(jī)", "平板", "手表"]
sales = [320, 210, 560, 180, 260]
plt.figure(figsize=(8, 5))
plt.bar(products, sales, color="orange", width=0.6)
plt.title("不同產(chǎn)品銷(xiāo)量對(duì)比")
plt.xlabel("產(chǎn)品")
plt.ylabel("銷(xiāo)量")
for index, value in enumerate(sales):
plt.text(index, value + 10, str(value), ha="center")
plt.show()
這里使用了 plt.text() 給柱子頂部添加數(shù)值標(biāo)簽,讓圖表更容易閱讀。
參數(shù)說(shuō)明:
plt.bar(x, height):繪制柱狀圖width=0.6:設(shè)置柱子的寬度ha="center":讓文字水平居中
五、繪制餅圖
餅圖適合展示各部分在整體中的占比,例如銷(xiāo)售渠道占比、用戶來(lái)源占比、支出結(jié)構(gòu)等。
下面的例子繪制“用戶來(lái)源占比”餅圖:
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
channels = ["搜索引擎", "短視頻", "社交媒體", "直接訪問(wèn)", "郵件"]
users = [35, 25, 20, 15, 5]
plt.figure(figsize=(7, 7))
plt.pie(
users,
labels=channels,
autopct="%.1f%%",
startangle=90,
counterclock=False
)
plt.title("用戶來(lái)源占比")
plt.show()
常用參數(shù)說(shuō)明:
labels:設(shè)置每個(gè)扇區(qū)的名稱(chēng)autopct="%.1f%%":顯示百分比,并保留 1 位小數(shù)startangle=90:設(shè)置餅圖起始角度counterclock=False:按順時(shí)針?lè)较蚶L制
六、設(shè)置圖表標(biāo)題和坐標(biāo)軸
一張完整的圖表通常需要包含標(biāo)題、橫坐標(biāo)名稱(chēng)、縱坐標(biāo)名稱(chēng)和圖例。否則讀者很難理解圖表表達(dá)的含義。
常用設(shè)置如下:
plt.title("圖表標(biāo)題")
plt.xlabel("橫坐標(biāo)名稱(chēng)")
plt.ylabel("縱坐標(biāo)名稱(chēng)")
plt.legend()
如果想設(shè)置標(biāo)題字體大小,可以這樣寫(xiě):
plt.title("圖表標(biāo)題", fontsize=16)
plt.xlabel("橫坐標(biāo)名稱(chēng)", fontsize=12)
plt.ylabel("縱坐標(biāo)名稱(chēng)", fontsize=12)
如果橫坐標(biāo)文字較長(zhǎng),可以旋轉(zhuǎn)一定角度:
plt.xticks(rotation=45)
如果圖表元素顯示得比較擠,可以使用:
plt.tight_layout()
它會(huì)自動(dòng)調(diào)整圖表邊距,減少文字被遮擋的情況。
七、從 Excel 中讀取數(shù)據(jù)繪圖
實(shí)際工作中,數(shù)據(jù)通常不是直接寫(xiě)在代碼里,而是保存在 Excel 表格中。我們可以使用 pandas 讀取 Excel,再用 matplotlib 繪圖。
假設(shè)有一個(gè) Excel 文件 sales_data.xlsx,內(nèi)容如下:
| 月份 | 銷(xiāo)售額 |
|---|---|
| 1月 | 12000 |
| 2月 | 15000 |
| 3月 | 18000 |
| 4月 | 16000 |
| 5月 | 21000 |
| 6月 | 26000 |
讀取并繪制折線圖:
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
df = pd.read_excel("sales_data.xlsx")
months = df["月份"]
sales = df["銷(xiāo)售額"]
plt.figure(figsize=(8, 5))
plt.plot(months, sales, marker="o", color="green", linewidth=2)
plt.title("從 Excel 讀取數(shù)據(jù)繪制銷(xiāo)售額趨勢(shì)圖")
plt.xlabel("月份")
plt.ylabel("銷(xiāo)售額(元)")
plt.grid(True, linestyle="--", alpha=0.5)
plt.tight_layout()
plt.show()
如果你的 Excel 文件不在當(dāng)前 Python 文件所在目錄,需要寫(xiě)完整路徑,例如:
df = pd.read_excel(r"D:\data\sales_data.xlsx")
注意路徑前面的 r,它可以避免 Windows 路徑中的反斜杠被轉(zhuǎn)義。
八、完整演示代碼
下面是一份完整示例代碼,會(huì)自動(dòng)創(chuàng)建一個(gè) Excel 文件,然后依次繪制折線圖、柱狀圖、餅圖,并演示如何從 Excel 中讀取數(shù)據(jù)繪圖。
你可以把它保存為 matplotlib_demo.py 后直接運(yùn)行。
import pandas as pd
import matplotlib.pyplot as plt
def set_chinese_font():
"""設(shè)置中文字體,解決中文亂碼和負(fù)號(hào)顯示問(wèn)題。"""
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
def draw_line_chart():
months = ["1月", "2月", "3月", "4月", "5月", "6月"]
sales = [12000, 15000, 18000, 16000, 21000, 26000]
plt.figure(figsize=(8, 5))
plt.plot(months, sales, marker="o", color="blue", linewidth=2, label="銷(xiāo)售額")
plt.title("上半年銷(xiāo)售額趨勢(shì)", fontsize=16)
plt.xlabel("月份")
plt.ylabel("銷(xiāo)售額(元)")
plt.legend()
plt.grid(True, linestyle="--", alpha=0.5)
plt.tight_layout()
plt.show()
def draw_bar_chart():
products = ["手機(jī)", "電腦", "耳機(jī)", "平板", "手表"]
sales = [320, 210, 560, 180, 260]
plt.figure(figsize=(8, 5))
plt.bar(products, sales, color="orange", width=0.6)
plt.title("不同產(chǎn)品銷(xiāo)量對(duì)比", fontsize=16)
plt.xlabel("產(chǎn)品")
plt.ylabel("銷(xiāo)量")
for index, value in enumerate(sales):
plt.text(index, value + 10, str(value), ha="center")
plt.tight_layout()
plt.show()
def draw_pie_chart():
channels = ["搜索引擎", "短視頻", "社交媒體", "直接訪問(wèn)", "郵件"]
users = [35, 25, 20, 15, 5]
plt.figure(figsize=(7, 7))
plt.pie(
users,
labels=channels,
autopct="%.1f%%",
startangle=90,
counterclock=False
)
plt.title("用戶來(lái)源占比", fontsize=16)
plt.tight_layout()
plt.show()
def create_excel_file():
data = {
"月份": ["1月", "2月", "3月", "4月", "5月", "6月"],
"銷(xiāo)售額": [12000, 15000, 18000, 16000, 21000, 26000]
}
df = pd.DataFrame(data)
df.to_excel("sales_data.xlsx", index=False)
def draw_chart_from_excel():
df = pd.read_excel("sales_data.xlsx")
months = df["月份"]
sales = df["銷(xiāo)售額"]
plt.figure(figsize=(8, 5))
plt.plot(months, sales, marker="o", color="green", linewidth=2, label="Excel 數(shù)據(jù)")
plt.title("從 Excel 讀取數(shù)據(jù)繪制銷(xiāo)售額趨勢(shì)圖", fontsize=16)
plt.xlabel("月份")
plt.ylabel("銷(xiāo)售額(元)")
plt.legend()
plt.grid(True, linestyle="--", alpha=0.5)
plt.tight_layout()
plt.show()
if __name__ == "__main__":
set_chinese_font()
create_excel_file()
draw_line_chart()
draw_bar_chart()
draw_pie_chart()
draw_chart_from_excel()
運(yùn)行代碼后,你會(huì)依次看到四張圖表:
- 上半年銷(xiāo)售額折線圖
- 不同產(chǎn)品銷(xiāo)量柱狀圖
- 用戶來(lái)源占比餅圖
- 從 Excel 讀取數(shù)據(jù)繪制的銷(xiāo)售額趨勢(shì)圖
九、初學(xué)者常見(jiàn)問(wèn)題
1. 為什么運(yùn)行后沒(méi)有顯示圖表?
請(qǐng)確認(rèn)代碼最后調(diào)用了:
plt.show()
如果你在 Jupyter Notebook 中運(yùn)行,也可以在代碼最前面添加:
%matplotlib inline
2. 為什么中文還是亂碼?
可能是系統(tǒng)中沒(méi)有安裝代碼中指定的中文字體??梢韵炔榭聪到y(tǒng)字體,再把字體名稱(chēng)改成可用字體。
Windows 常用:
plt.rcParams["font.sans-serif"] = ["SimHei"]
macOS 常用:
plt.rcParams["font.sans-serif"] = ["Arial Unicode MS"]
Linux 可以使用:
plt.rcParams["font.sans-serif"] = ["Noto Sans CJK SC"]
3. 為什么讀取 Excel 報(bào)錯(cuò)?
如果報(bào)錯(cuò)提示缺少 openpyxl,安裝即可:
pip install openpyxl
如果報(bào)錯(cuò)提示找不到文件,請(qǐng)檢查 Excel 文件名和路徑是否正確。
十、總結(jié)
本文介紹了 Python 數(shù)據(jù)可視化入門(mén)中最常用的 matplotlib 操作,包括:
matplotlib庫(kù)的基本作用- 折線圖繪制
- 柱狀圖繪制
- 餅圖繪制
- 中文亂碼和負(fù)號(hào)顯示問(wèn)題解決
- 圖表標(biāo)題、坐標(biāo)軸、圖例和網(wǎng)格線設(shè)置
- 從 Excel 中讀取數(shù)據(jù)并繪圖
- 一份可直接運(yùn)行的完整演示代碼
對(duì)于 Python 數(shù)據(jù)分析初學(xué)者來(lái)說(shuō),建議先熟練掌握折線圖、柱狀圖和餅圖這三類(lèi)基礎(chǔ)圖表。后續(xù)再結(jié)合 pandas 做數(shù)據(jù)清洗和分組統(tǒng)計(jì),就可以完成很多實(shí)用的數(shù)據(jù)分析可視化任務(wù)。
以上就是Python+matplotlib繪制常見(jiàn)圖表的入門(mén)教程的詳細(xì)內(nèi)容,更多關(guān)于Python matplotlib繪制圖表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python實(shí)現(xiàn)可以斷點(diǎn)續(xù)傳和并發(fā)的ftp程序
斷點(diǎn)續(xù)傳和并發(fā)是現(xiàn)在很多ftp程序都支持的功能,如果我們用python如何來(lái)做斷點(diǎn)續(xù)傳和并發(fā)了,今天來(lái)看一篇python實(shí)現(xiàn)斷點(diǎn)續(xù)傳和并發(fā)的ftp程序例子吧,具體如下。2016-09-09
如何實(shí)現(xiàn)更換Jupyter Notebook內(nèi)核Python版本
這篇文章主要介紹了如何實(shí)現(xiàn)更換Jupyter Notebook內(nèi)核Python版本,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Python實(shí)現(xiàn)將.py代碼轉(zhuǎn)換為帶語(yǔ)法高亮的Word和PDF
本指南介紹了幾種將?Python?代碼轉(zhuǎn)換為?Word?和?PDF?文檔的方法,確保您的代碼易于閱讀,并且以專(zhuān)業(yè)的方式呈現(xiàn),有需要的小伙伴可以參考下2025-12-12
Python爬蟲(chóng)代理IP池實(shí)現(xiàn)方法
在公司做分布式深網(wǎng)爬蟲(chóng),搭建了一套穩(wěn)定的代理池服務(wù),為上千個(gè)爬蟲(chóng)提供有效的代理,保證各個(gè)爬蟲(chóng)拿到的都是對(duì)應(yīng)網(wǎng)站有效的代理IP,從而保證爬蟲(chóng)快速穩(wěn)定的運(yùn)行,所以就想利用一些免費(fèi)的資源搞一個(gè)簡(jiǎn)單的代理池服務(wù)。2017-01-01
淺談Python數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換
下面小編就為大家?guī)?lái)一篇淺談Python數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06
Python基于多線程實(shí)現(xiàn)抓取數(shù)據(jù)存入數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Python基于多線程實(shí)現(xiàn)抓取數(shù)據(jù)存入數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式分析了Python使用數(shù)據(jù)庫(kù)類(lèi)與多線程類(lèi)進(jìn)行數(shù)據(jù)抓取與寫(xiě)入數(shù)據(jù)庫(kù)操作的具體使用技巧,需要的朋友可以參考下2018-06-06
使用python字典統(tǒng)計(jì)CSV數(shù)據(jù)的步驟和示例代碼
為了使用Python字典來(lái)統(tǒng)計(jì)CSV數(shù)據(jù),我們可以使用內(nèi)置的csv模塊來(lái)讀取CSV文件,并使用字典來(lái)存儲(chǔ)統(tǒng)計(jì)信息,以下是一個(gè)詳細(xì)的步驟和完整的代碼示例,需要的朋友可以參考下2024-12-12
Jupyter、PyCharm配置Anaconda虛擬環(huán)境全過(guò)程
本文介紹了如何在Anaconda中創(chuàng)建、激活、安裝包、刪除包和刪除虛擬環(huán)境,以及如何將虛擬環(huán)境添加到Jupyter Notebook中,同時(shí),還提到了解決在安裝包時(shí)遇到的常見(jiàn)問(wèn)題2026-02-02

