Matplotlib可視化之使用pandas和Seaborn繪制精美圖表詳解
Matplotlib 可視化
入門(mén)演示
matplotlib 的繪圖基本步驟:
- 創(chuàng)建畫(huà)布
- 準(zhǔn)備數(shù)據(jù)集,X軸,Y軸
- 可選:顏色,線(xiàn)型,標(biāo)簽,網(wǎng)格,圖例,標(biāo)題,坐標(biāo)軸標(biāo)簽。
- 繪制圖像
import matplotlib.pyplot as plt # 創(chuàng)建一個(gè)10英寸的寬和5英寸的高的畫(huà)布 # 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) # 折線(xiàn)圖 # 展示圖 plt.show()
設(shè)置刻度尺,配置中文
import matplotlib.pyplot as plt # 設(shè)置中文 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False
通過(guò) 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)建畫(huà)布
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è)置線(xiàn)風(fēng)格。
- (-)實(shí)線(xiàn)
- (--)虛線(xiàn)
- (-.)一個(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('溫度變化曲線(xiàn)', 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è)線(xiàn) plt.plot(x, y, label='北京') # 繪制第二個(gè)線(xiàn) plt.plot(x, m, label='摩訶')
| 顏色字符 | 風(fēng)格字符 |
|---|---|
| r 紅色 | - 實(shí)線(xiàn) |
| g 綠色 | - - 虛線(xiàn) |
| b 藍(lán)色 | -. 點(diǎn)劃線(xiàn) |
| w 白色 | : 點(diǎn)虛線(xiàn) |
| c 青色 | ' ' 留空、空格 |
| m 洋紅 | |
| y 黃色 | |
| k 黑色 |
加圖例的關(guān)鍵代碼,loc 設(shè)置 best,表示自動(dòng)匹配最好的位置。這個(gè) loc 會(huì)根據(jù) label 來(lái)匹配,如果在繪制時(shí)沒(méi)設(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è)線(xiàn)
plt.plot(x, y, label='北京', color='r')
# 繪制第二個(gè)線(xiàn)
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('溫度變化曲線(xiàn)', fontsize=20)
plt.show()
多個(gè)坐標(biāo)系,在一個(gè)畫(huà)布
主要是通過(guò)下面,獲取到了分割后的畫(huà)布,對(duì)每個(gè)畫(huà)布進(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 -> 畫(huà)布(1行2列的畫(huà)布),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 官方案例庫(kù)
- 折線(xiàn)圖用來(lái)看趨勢(shì)
- 柱狀圖用來(lái)看對(duì)比
- 直方圖用來(lái)展示數(shù)據(jù)的分布情況
- 散點(diǎn)圖用來(lái)描述兩個(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è)置畫(huà)布大小
plt.figure(figsize=(20,8))
# 2. 繪制柱狀圖
plt.bar(x, y, color='r')
# 3. 設(shè)置 x軸,y軸標(biāo)簽 和標(biāo)題
plt.xlabel('分類(lèi)名')
plt.ylabel('商品個(gè)數(shù)')
plt.title('商品分類(lèi)統(tǒng)計(jì)圖', fontsize=15)
plt.show()

繪制直方圖
由一系列高度不等的縱向條紋或線(xiàn)段表示數(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]
# 分類(lèi)標(biāo)簽
labels = ['電腦', '手機(jī)', '鍵盤(pán)', '鼠標(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)分的葡萄酒種類(lèi)(個(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) # 折線(xiàn)圖

Seaborn 繪圖
底層依賴(lài) 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')

如何修改畫(huà)布大小和標(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)圖,它不能使用分組
# 擬合回歸線(xiàn) sns.regplot(data=df, x='total_bill', y='tip')

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

它如果加上,分組,會(huì)使用折線(xiàn)圖,而不是直方圖
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()

箱線(xiàn)圖 / 何須圖
- Q3:四分之三
- 中位數(shù):二分之一
- q1:四分之一
import seaborn as sns
import matplotlib.pyplot as plt
# 聯(lián)網(wǎng)加載數(shù)據(jù)集
df = sns.load_dataset('tips')
# 線(xiàn)箱圖
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庫(kù)的詳細(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ù)可視化庫(kù)Matplotlib實(shí)現(xiàn)折線(xiàn)圖
- Python數(shù)據(jù)可視化實(shí)踐之使用Matplotlib繪制圖表
相關(guān)文章
Python超越函數(shù)積分運(yùn)算以及繪圖實(shí)現(xiàn)代碼
今天小編就為大家分享一篇Python超越函數(shù)積分運(yùn)算以及繪圖實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
Python實(shí)現(xiàn)變量數(shù)值交換及判斷數(shù)組是否含有某個(gè)元素的方法
這篇文章主要介紹了Python實(shí)現(xiàn)變量數(shù)值交換及判斷數(shù)組是否含有某個(gè)元素的方法,涉及Python字符串與數(shù)組的相關(guān)賦值、判斷操作技巧,需要的朋友可以參考下2017-09-09
如何配置關(guān)聯(lián)Python 解釋器 Anaconda的教程(圖解)
這篇文章主要介紹了如何配置關(guān)聯(lián)Python 解釋器 Anaconda的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)火鍋工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
簡(jiǎn)化Python瀏覽器自動(dòng)化的三種模式
在如今的網(wǎng)絡(luò)數(shù)據(jù)處理與自動(dòng)化任務(wù)中,瀏覽器自動(dòng)化已成為不可或缺的技術(shù),為了便于 Python 開(kāi)發(fā)者更高效地進(jìn)行網(wǎng)頁(yè)操作,DrissionPage 提供了一種輕量級(jí)且功能強(qiáng)大的解決方案,本文將深入解讀 DrissionPage 的三種核心模式,需要的朋友可以參考下2025-03-03
python打包為linux可執(zhí)行文件的詳細(xì)圖文教程
這篇文章主要給大家介紹了關(guān)于python打包為linux可執(zhí)行文件的詳細(xì)圖文教程,本文介紹的方法可以輕松地將Python代碼變成獨(dú)立的可執(zhí)行文件,需要的朋友可以參考下2024-02-02

