Matplotlib可視化之使用pandas和Seaborn繪制精美圖表詳解
Matplotlib 可視化
入門演示
matplotlib 的繪圖基本步驟:
- 創(chuàng)建畫布
- 準(zhǔn)備數(shù)據(jù)集,X軸,Y軸
- 可選:顏色,線型,標(biāo)簽,網(wǎng)格,圖例,標(biāo)題,坐標(biāo)軸標(biāo)簽。
- 繪制圖像
import matplotlib.pyplot as plt # 創(chuàng)建一個(gè)10英寸的寬和5英寸的高的畫布 # dpi 點(diǎn)數(shù) 80,表示清晰度。 # 10 * 80,5 * 80 plt.figure(figsize=(10, 5), dpi=80) # 準(zhǔn)備數(shù)據(jù) x = [1, 2, 3, 4, 5, 6, 7] y = [6, 2, 10, 14, 21, 25, 30] # 準(zhǔn)備繪制 plt.plot(x, y) # 折線圖 # 展示圖 plt.show()
設(shè)置刻度尺,配置中文
import matplotlib.pyplot as plt # 設(shè)置中文 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False
通過 plt.xticks 和 plt.yticks 設(shè)置對(duì)應(yīng)的刻度尺
# 返回一個(gè)迭代對(duì)象,0 - 60,這是 X軸
x = range(60)
# y 軸,范圍 15 ~ 18
y = [random.uniform(15, 18) for i in x]
# 創(chuàng)建畫布
plt.figure(figsize=(10, 5), dpi=80)
# 繪制圖像
plt.plot(x, y)
# 自定義X軸和Y軸
x_ticks_label = [f'11點(diǎn){i}分' for i in x]
y_ticks_label = [i for i in range(0, 25)]
# 具體設(shè)置,但是如果不切片,那會(huì)顯得很密集,所以需要切片,注意必須都切片
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks_label[::5])
# 顯示
plt.show()

添加網(wǎng)格,標(biāo)題
主要實(shí)現(xiàn)plt.grid
- linestyle:設(shè)置線風(fēng)格。
- (-)實(shí)線
- (--)虛線
- (-.)一個(gè)杠一個(gè).
- (:)兩個(gè)點(diǎn)
- (' ')留空、空格
- alpha:設(shè)置透明度,最大1,最小0
設(shè)置標(biāo)題 / 保存為圖片
- xlabel
- ylabel
- title
- savefig
import matplotlib.pyplot as plt
import random
x = range(60)
y = [random.uniform(15, 18) for i in x]
plt.figure(figsize=(10, 5), dpi=80)
plt.plot(x, y)
# 自定義X軸和Y軸
x_ticks_label = [f'11點(diǎn){i}分' for i in x]
y_ticks_label = [i for i in range(0, 25)]
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks_label[::5])
# 添加網(wǎng)格
plt.grid(linestyle=':', alpha=1)
# 添加標(biāo)簽
plt.xlabel('時(shí)間', fontsize=15)
plt.ylabel('溫度', fontsize=15)
# 添加標(biāo)題
plt.title('溫度變化曲線', fontsize=20)
plt.savefig('temp.png')
plt.show()
一張圖繪制多個(gè) / 增加圖例
繪制多個(gè)圖的關(guān)鍵點(diǎn),給每個(gè)plot要加一個(gè)label,表示名字,后續(xù)圖例使用。
- color 用于設(shè)置顏色,生成的圖例有顏色。
- label 文字
# 準(zhǔn)備數(shù)據(jù) x = range(60) # 第一個(gè)圖的數(shù)據(jù) y = [random.uniform(15, 18) for i in x] # 第二個(gè)圖的數(shù)據(jù) m = [random.uniform(1, 10) for i in x] plt.figure(figsize=(10, 5), dpi=80) # 繪制第一個(gè)線 plt.plot(x, y, label='北京') # 繪制第二個(gè)線 plt.plot(x, m, label='摩訶')
| 顏色字符 | 風(fēng)格字符 |
|---|---|
| r 紅色 | - 實(shí)線 |
| g 綠色 | - - 虛線 |
| b 藍(lán)色 | -. 點(diǎn)劃線 |
| w 白色 | : 點(diǎn)虛線 |
| c 青色 | ' ' 留空、空格 |
| m 洋紅 | |
| y 黃色 | |
| k 黑色 |
加圖例的關(guān)鍵代碼,loc 設(shè)置 best,表示自動(dòng)匹配最好的位置。這個(gè) loc 會(huì)根據(jù) label 來匹配,如果在繪制時(shí)沒設(shè)置 label,不會(huì)生成的。
loc 設(shè)置圖例位置
# 增加圖例 plt.legend(loc='best')
設(shè)置位置
| 位置 string | 位置代碼 |
|---|---|
| 'best' | 0 |
| 'upper right' | 1 |
| 'upper left' | 2 |
| 'lower left' | 3 |
| 'lower right' | 4 |
| 'right' | 5 |
| 'center left' | 6 |
| 'center right' | 7 |
| 'lower center' | 8 |
| 'upper center' | 9 |
| 'center' | 10 |
完整代碼演示
import matplotlib.pyplot as plt
import random
# 準(zhǔn)備數(shù)據(jù)
x = range(60)
# 第一個(gè)圖的數(shù)據(jù)
y = [random.uniform(15, 18) for i in x]
# 第二個(gè)圖的數(shù)據(jù)
m = [random.uniform(1, 10) for i in x]
plt.figure(figsize=(10, 5), dpi=80)
# 繪制第一個(gè)線
plt.plot(x, y, label='北京', color='r')
# 繪制第二個(gè)線
plt.plot(x, m, label='摩訶', color='c')
# 增加圖例
plt.legend(loc='best')
x_ticks_label = [f'11點(diǎn){i}分' for i in x]
y_ticks_label = [i for i in range(0, 25)]
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks_label[::5])
plt.grid(linestyle=':', alpha=1)
plt.xlabel('時(shí)間', fontsize=15)
plt.ylabel('溫度', fontsize=15)
plt.title('溫度變化曲線', fontsize=20)
plt.show()
多個(gè)坐標(biāo)系,在一個(gè)畫布
主要是通過下面,獲取到了分割后的畫布,對(duì)每個(gè)畫布進(jìn)行單獨(dú)設(shè)置。
fig, ax = plt.subplots(figsize=(20, 8), nrows=1, ncols=2)
完整代碼
import matplotlib.pyplot as plt
import random
# 準(zhǔn)備數(shù)據(jù)
x = range(60)
y = [random.uniform(15, 18) for i in x]
m = [random.uniform(1, 10) for i in x]
# 面向?qū)ο罄L圖,fig -> 畫布(1行2列的畫布),ax -> 坐標(biāo)系
fig, ax = plt.subplots(figsize=(20, 8), nrows=1, ncols=2)
# 繪制圖像
ax[0].plot(x, y, color='r', label='北京')
ax[1].plot(x, m, color='c', label='摩訶')
# 添加刻度
# 刻度變量
x_ticks_label = [f'11點(diǎn){i}分' for i in x]
y_ticks_label = [i for i in range(0, 25)]
# 具體添加刻度的操作
ax[0].set_xticks(x[::5]) # 圖 1 的 x軸
ax[0].set_yticks(y_ticks_label[::5]) # 圖 1 的 y軸
ax[0].set_xticklabels(x_ticks_label[::5]) # 圖 1 的 x軸的值
# 具體添加刻度的操作
ax[1].set_xticks(x[::5]) # 圖 1 的 x軸
ax[1].set_yticks(y_ticks_label[::5]) # 圖 1 的 y軸
ax[1].set_xticklabels(x_ticks_label[::5]) # 圖 1 的 x軸的值
plt.show()

目前是這樣,我們繼續(xù)添加
設(shè)置 x y 軸的標(biāo)題和大小
ax[0].set_ylabel('溫度')
ax[0].set_xlabel('時(shí)間')
ax[0].set_title('一段時(shí)間的溫度變化', fontsize=20)
ax[1].set_ylabel('溫度')
ax[1].set_xlabel('時(shí)間')
ax[1].set_title('一段時(shí)間的溫度變化', fontsize=20)
# 添加圖例
ax[0].legend(loc='best')
ax[1].legend(loc=0)
# 保存圖片
plt.savefig('test.png')
plt.show()
其他圖像繪制
matplotlib.org/stable/gallery/index.html 官方案例庫
- 折線圖用來看趨勢
- 柱狀圖用來看對(duì)比
- 直方圖用來展示數(shù)據(jù)的分布情況
- 散點(diǎn)圖用來描述兩個(gè)連續(xù)變量之間的關(guān)系
繪制柱狀圖
import matplotlib.pyplot as plt
# 1. 準(zhǔn)備數(shù)據(jù)
x = ['A', 'B', 'C', 'D', 'E']
y = [3, 6, 1, 8, 2]
# 額外可以設(shè)置畫布大小
plt.figure(figsize=(20,8))
# 2. 繪制柱狀圖
plt.bar(x, y, color='r')
# 3. 設(shè)置 x軸,y軸標(biāo)簽 和標(biāo)題
plt.xlabel('分類名')
plt.ylabel('商品個(gè)數(shù)')
plt.title('商品分類統(tǒng)計(jì)圖', fontsize=15)
plt.show()

繪制直方圖
由一系列高度不等的縱向條紋或線段表示數(shù)據(jù)分布的情況。 一般用橫軸表示數(shù)據(jù)范圍,縱軸表示分布情況。
特點(diǎn):繪制連續(xù)性的數(shù)據(jù)展示一組或者多組數(shù)據(jù)的分布狀況(統(tǒng)計(jì))
import matplotlib.pyplot as plt import numpy as np # 1. 準(zhǔn)備數(shù)據(jù) data = np.random.randn(500) # 2. 創(chuàng)建面板 plt.figure(figsize=(20, 8)) # 3. 繪制圖形,rwidth 柱子之間的寬度,bins 柱子大小 plt.hist(data, bins=20, color='r', alpha=0.5, rwidth=0.8) # 4. 顯示 plt.show()

繪制餅圖
import matplotlib.pyplot as plt
# 準(zhǔn)備數(shù)據(jù)
sizes = [25, 35, 25, 15]
# 分類標(biāo)簽
labels = ['電腦', '手機(jī)', '鍵盤', '鼠標(biāo)']
# 就提繪圖動(dòng)作, autopct 顯示百分比
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
# 設(shè)置圖表標(biāo)題
plt.title("Simple Pie Chart")
plt.show()

散點(diǎn)圖
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
plt.scatter(x, y, color='red') # 繪制紅色散點(diǎn)圖
plt.title("Simple Scatter Plot") # 設(shè)置圖表標(biāo)題
plt.xlabel("X-axis") # 設(shè)置X軸標(biāo)簽
plt.ylabel("Y-axis") # 設(shè)置Y軸標(biāo)簽
plt.show() # 顯示圖表

pandas 繪圖
要統(tǒng)計(jì)個(gè)數(shù)的兩種方式
# 思路一:稍微復(fù)雜一點(diǎn)
# df.groupby('province')['province'].count().sort_values(ascending=False).head(10)
df['province'].value_counts()
柱狀圖
df['province'].value_counts().head(10).plot.bar(fontsize=15, figsize=(10,6), color=['r', 'g', 'b', 'y', 'c', 'm', 'k', 'pink', 'gray', 'orange'])

面積圖
kwords = dict(fontsize=15, figsize=(10, 6), color=['r', 'g', 'b', 'y', 'c', 'm', 'k', 'pink', 'gray', 'orange']) df['province'].value_counts().head(10).plot.area(**kwords)

案例
獲取產(chǎn)葡萄酒最多的10個(gè)產(chǎn)地的 占比
kwords = dict(fontsize=15, figsize=(10, 6), color=['r', 'g', 'b', 'y', 'c', 'm', 'k', 'pink', 'gray', 'orange']) (df['province'].value_counts().head(10) / len(df)).plot.bar(**kwords)

展示每個(gè)評(píng)分的葡萄酒種類(個(gè)數(shù))
kwords = dict(fontsize=15, figsize=(10, 6), color=['r', 'g', 'b', 'y', 'c', 'm', 'k', 'pink', 'gray', 'orange']) df['points'].value_counts().sort_index().plot.bar(**kwords) # 柱狀圖 df['points'].value_counts().sort_index().plot.area(**kwords) # 面積圖 df['points'].value_counts().sort_index().plot.line(**kwords) # 折線圖

Seaborn 繪圖
底層依賴 Matplotlib
pip install seaborn
已知數(shù)據(jù)

柱狀圖
按照性別,進(jìn)行統(tǒng)計(jì)
- x 是繪制的列名
- hue 是分組的名字
import seaborn as sns
# 聯(lián)網(wǎng)加載數(shù)據(jù)集
df = sns.load_dataset('tips')
# 按照性別字段進(jìn)行統(tǒng)計(jì)
sns.countplot(data=df, x='sex')
sns.countplot(data=df, x='day', hue='sex')


繪制直方圖
import seaborn as sns
# 聯(lián)網(wǎng)加載數(shù)據(jù)集
df = sns.load_dataset('tips')
sns.histplot(data=df, x='total_bill', hue='sex')

如何修改畫布大小和標(biāo)題
import seaborn as sns
import matplotlib.pyplot as plt
# 設(shè)置亂碼
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig, ax = plt.subplots(figsize=(10, 6))
sns.histplot(data=df, x='total_bill', hue='sex')
ax.set_title('男女總賬單分布情況', fontsize=20)
plt.show()

案例
需求:描述總賬單金額和小費(fèi)的分布情況(散點(diǎn)圖,關(guān)系圖)
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig, ax = plt.subplots(figsize=(10, 6))
# x軸。總賬單,y軸,消費(fèi),按照性別分組
sns.scatterplot(data=df, x='total_bill', y='tip', hue='sex')
ax.set_title('總賬單金額和小費(fèi)的關(guān)系圖', fontsize=20)
plt.show()
還有其他方式繪制出,散點(diǎn)圖,它不能使用分組
# 擬合回歸線 sns.regplot(data=df, x='total_bill', y='tip')

還有一種方式,帶上直方圖的散點(diǎn)圖,注意它不需要和上面代碼混合在一起,它自帶畫布等
import seaborn as sns import matplotlib.pyplot as plt sns.jointplot(data=df, x='total_bill', y='tip') plt.show()

它如果加上,分組,會(huì)使用折線圖,而不是直方圖
sns.jointplot(data=df, x='total_bill', y='tip', hue='sex') plt.show()

加上 kind = red,使用正態(tài)分布,它不允許與 hue 分組一起使用
sns.jointplot(data=df, x='total_bill', y='tip', kind='reg') plt.show()

還可以變成,蜂巢圖
sns.jointplot(data=df, x='total_bill', y='tip', kind='hex') plt.show()

箱線圖 / 何須圖
- Q3:四分之三
- 中位數(shù):二分之一
- q1:四分之一
import seaborn as sns
import matplotlib.pyplot as plt
# 聯(lián)網(wǎng)加載數(shù)據(jù)集
df = sns.load_dataset('tips')
# 線箱圖
sns.boxplot(data=df, x='time', y='total_bill')
plt.show()

小提琴圖
import seaborn as sns
import matplotlib.pyplot as plt
# 聯(lián)網(wǎng)加載數(shù)據(jù)集
df = sns.load_dataset('tips')
sns.violinplot(data=df, x='time', y='total_bill')
plt.show()

希望分組,使用 hue
sns.violinplot(data=df, x='time', y='total_bill', hue='sex')
希望切割,使用 split
sns.violinplot(data=df, x='time', y='total_bill', hue='sex', split=True)
以上就是Matplotlib可視化之使用pandas和Seaborn繪制精美圖表詳解的詳細(xì)內(nèi)容,更多關(guān)于Matplotlib可視化繪圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python可視化與交互matplotlib庫的詳細(xì)介紹
- Python可視化工具M(jìn)atplotlib的20種圖表用法
- 使用Python?Matplotlib處理地理數(shù)據(jù)可視化
- 使用Matplotlib創(chuàng)建自定義可視化圖表的方法小結(jié)
- 使用Matplotlib創(chuàng)建漂亮的數(shù)據(jù)可視化圖表
- matplotlib實(shí)現(xiàn)矩陣和圖像的可視化表示
- 使用Python的數(shù)據(jù)可視化庫Matplotlib實(shí)現(xiàn)折線圖
- Python數(shù)據(jù)可視化實(shí)踐之使用Matplotlib繪制圖表
相關(guān)文章
詳解python實(shí)現(xiàn)多張多格式圖片轉(zhuǎn)PDF并打包成exe
這篇文章主要為大家介紹了python實(shí)現(xiàn)多張多格式圖片轉(zhuǎn)PDF并打包成exe方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
python3報(bào)錯(cuò)check_hostname?requires?server_hostname的解決
這篇文章主要介紹了python3報(bào)錯(cuò)check_hostname?requires?server_hostname的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Pycharm如何設(shè)置默認(rèn)請(qǐng)求頭和切換python環(huán)境
這篇文章主要介紹了Pycharm如何設(shè)置默認(rèn)請(qǐng)求頭和切換python環(huán)境問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Python結(jié)合ffmpeg 實(shí)現(xiàn)單線程和多線程推流
本文主要介紹了Python結(jié)合ffmpeg 實(shí)現(xiàn)單線程和多線程推流,將通過兩個(gè)不同的實(shí)現(xiàn)方式,即單線程推流和多線程推流,來展示如何利用?cv2(OpenCV)和?subprocess?等庫將視頻幀推送到指定的 RTMP 地址,感興趣的可以了解一下2025-06-06
Python實(shí)現(xiàn)手寫一個(gè)類似django的web框架示例

