安裝 pip install matplotlib
官方文檔 https://matplotlib.org/stable/api/pyplot_summary.html
主要介紹一些圖片繪制的簡要使用,更加詳細和進階需要可參考 以上官方文檔。
1 繪制基礎
方法名 | 說明 |
---|---|
title() | 設置圖表的名稱 |
xlabel() | 設置 x 軸名稱 |
ylabel() | 設置 y 軸名稱 |
xticks(x, ticks, rotation) | 設置 x 軸的刻度, rotation 為旋轉角度 |
yticks() | 設置 y 軸的刻度 |
plot() | 繪制線性圖表 |
show() | 顯示圖表 |
legend() | 顯示圖例 |
text(x, y, text) | 顯示每條數據的值,x, y 為值的位置 |
figure(name, figsize=(w, h), dpi=n) | 設置圖片大小,name 為圖片名稱,figsize 為圖片寬高尺寸,dpi 為圖片分辨率 |
1.1 基礎方法
import matplotlib.pyplot as plt
plt.plot([0,2],[1,4]) # 將 (0,1) (2,4) 兩點連成一條直線
plt.show() # 繪制折線
plt.plot([0,1,2,3],[0,1,4,9])
plt.show() plt.plot([0,1,2,3],[0,1,4,9], linewidth=5) # 設置線條寬度
plt.title("y = x ^ 2") # 設置圖形的標題
plt.xlabel("x") # 設置圖形 x 軸標簽
plt.ylabel("y") # 設置圖形 y 軸標簽
plt.show() # 繪制一元二次方程曲線
x = range(-100, 100) # x 的刻度越細 曲線越平滑
y = [i**2 for i in x]
plt.title("y = x ^ 2") # 設置圖形的標題
plt.plot(x, y)
plt.show() # 繪制正弦曲線和余弦曲線
import numpy as np
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.title("sin(x) and cos(x)")
plt.xlabel("x")
plt.ylabel("y")
plt.plot(x, y1)
plt.plot(x, y2)
plt.legend(["sin(x)", "cos(x)"], loc="best")
plt.show()
1.2 繪制子圖
x = np.linspace(1, 10, 100)
# 調整子圖間距
plt.subplots_adjust(wspace=0.4, hspace=0.6) # 增加子圖之間的寬度間距 plt.subplot(2, 2, 1)
plt.title("sin(x)")
plt.xlabel("x")
plt.ylabel("six(x)")
plt.plot(x, np.sin(x)) plt.subplot(2, 2, 2)
plt.title("cos(x)")
plt.xlabel("x")
plt.ylabel("cos(x)")
plt.plot(x, np.cos(x)) plt.subplot(2, 2, 3)
plt.title("tan(x)")
plt.xlabel("x")
plt.ylabel("tan(x)")
plt.plot(x, np.tan(x)) plt.subplot(2, 2, 4)
plt.title("log(x)")
plt.xlabel("x")
plt.ylabel("log(x)")
plt.plot(x, np.log(x))
plt.show()
也可以獲取子圖的對象進行對應的設置
# 創建一些數據
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x) # 創建一個 figure 和兩個子圖
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4)) # 繪制第一個子圖
ax1.plot(x, y1, color='blue')
ax1.set_title('Sine Function')
ax1.set_xlabel('X axis')
ax1.set_ylabel('Y axis') # 繪制第二個子圖
ax2.plot(x, y2, color='red')
ax2.set_title('Cosine Function')
ax2.set_xlabel('X axis')
ax2.set_ylabel('Y axis') # 調整子圖間距
plt.subplots_adjust(wspace=0.4) # 增加子圖之間的寬度間距 # 顯示圖表
plt.show()
2 繪制散點圖
關于點樣式的寫法可參考 官網文檔 https://matplotlib.org/stable/api/pyplot_summary.html
x = np.arange(6)
plt.plot(x, x, "ro") # 紅色圓點 plt.plot(x, x ** 2, "g+") # 綠色加號
plt.show()
plt.close() # 關閉當前的 plt 重新開始繪圖 plt.scatter(x, x)
plt.show() # 繪制 10種大小 100種顏色的散點圖
np.random.seed(42)
x = np.random.rand(100)
y = np.random.rand(100)
colors = np.random.rand(100)
size = np.tile(np.random.rand(10), 10) * 100 # 生成 10個大小 需要復制 10次
np.random.shuffle(size) # 打亂大小
plt.scatter(x, y, c=colors, s=size, alpha=0.5)
3 繪制柱狀圖
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='./simhei.ttf')
x= np.linspace(0, 20, 4) # x 軸 柱的位置
x_labels=['2000 年','2001 年','2002 年','2003 年'] # x軸的標簽
y=[1000,3000,4000,5000]
plt.bar(x,y,width=3)
plt.xticks(x,x_labels, fontproperties=my_font) # 修改 x 軸的 標簽
plt.xlabel('年份', fontproperties=my_font)
plt.ylabel('銷量', fontproperties=my_font)
plt.title('根據年份銷量對比圖', fontproperties=my_font)
plt.show()
real_names=['A 公司','B 公司','C 公司']
real_num1=[2314,4521,5632]
real_num2=[2211,1223,2222]
real_num3=[1115,1111,3333]
#生成 x 第 1 天 第 2 天 第 3 天
x=np.arange(len(real_names))
x_label=['第{}天'.format(i+1) for i in range(len(real_names))]
#繪制柱狀圖
#設置柱的寬度
width=0.3
plt.bar(x,real_num1,color='g',width=width,label=real_names[0])
plt.bar([i+width for i in x],real_num2,color='b',width=width,label=real_names[1])
plt.bar([i+2*width for i in x],real_num3,color='r',width=width,label=real_names[2])
#修改 x 坐標
plt.xticks([i+width for i in x],x_label, fontproperties=my_font)
#添加圖例
plt.legend(loc="best", labels=real_names, prop=my_font)
#添加標題
plt.title('3 天的銷售量', fontproperties=my_font)
plt.show()
4 繪制餅狀圖
import matplotlib.pyplot as plt
import numpy as np
male = 200
female = 150
male_percent = male / (male + female)
female_percent = female / (male + female)
labels = ['male', 'female']
colors = ['lightblue', 'pink'] paches, text, autotexts = plt.pie([male_percent, female_percent], labels=labels, colors=colors, autopct= '%0.1f%%')
# 設置餅狀圖中的字體顏色與字體大小
for text in autotexts: text.set_color('white') text.set_fontsize(20)
plt.title('Gender Distribution')
plt.show()
pandas DataFrame 的某一列繪制餅狀圖
# Import
import pandas as pd
import matplotlib.pyplot as plt
df_raw = pd.read_csv("https://github.com/selva86/datasets/raw/master/mpg_ggplot2.csv")
plt.figure(figsize=(8, 8), dpi= 100)
# Prepare Data
df = df_raw.groupby('class').size() # Make the plot with pandas
df.plot(kind='pie', subplots=True, figsize=(8, 8))
plt.title("Pie Chart of Vehicle Class - Bad")
plt.ylabel("")
plt.show()
5 繪制直方圖
直方圖和柱狀圖很類似。
直方圖是用來觀察分布狀態的
柱狀圖是用來看每一個 X 坐標對應的 Y 值
直方圖關注的是分布,并不關心具體的某個值。
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(2000)
# plt.hist(x)
plt.hist(x, bins= 100) # 分成 100份
plt.show()
同一個畫布繪制三個直方圖
import numpy as np
import matplotlib.pyplot as plt plt.figure(figsize=(8,8), dpi=100) # figsize用來設置圖片大小, dpi 設置圖像清晰度
x1 = np.random.normal(0, 0.8, 1000)
x2 = np.random.normal(-1, 1, 1000)
x3 = np.random.normal(2, 2, 1000)
kwargs = dict(bins=100, alpha=0.5) plt.hist(x1, **kwargs)
plt.hist(x2, **kwargs)
plt.hist(x3, **kwargs) plt.show()
6 繪制等高線圖
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100) X, Y = np.meshgrid(x, y)
Z = np.sqrt(X**2 + Y**2)
plt.contourf(X, Y, Z)
plt.contour(X, Y, Z)
# 顏色越深表示值越小 中間的黑色表示 z = 0plt.show()
- 導入所需的庫:matplotlib.pyplot和numpy。
- 使用numpy的linspace函數生成一個從-5到5的等間距數組,數組大小為100
- 使用numpy的meshgrid函數將x和y轉換為網格
- 計算z=sqrt(x^2 + y^2),其中x和y是網格的坐標
- 使用matplotlib的contourf函數繪制等值線filled contour圖。contourf函數會填充z值大于某個閾值的區域
- 使用matplotlib的contour函數繪制等值線contour圖
- 最后,使用matplotlib的show函數顯示圖形。
7 繪制三維圖
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # 創建 X、Y、Z 坐標
X = np.linspace(-5, 5, 100)
Y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(X, Y)
Z = np.sin(np.sqrt(X**2 + Y**2)) # 創建3D圖
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d') # 繪制3D曲面
ax.plot_surface(X, Y, Z, cmap='viridis') # 設置坐標軸標簽
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z') # 顯示圖形
plt.show()