matplotlib學習
數據可視化
庫的導入:import matplotlib.pyplot as plt
繪製折線圖,並保存
(1)
import matplotlib.pyplot as plt
plt.plot([3, 1, 4, 5, 2]) # 默認爲y軸座標 x座標默認爲索引值
plt.ylabel("grade")
plt.savefig("test", dpi=600) # 格式爲PNG文件,圖像名稱爲test,dpi表示每英寸包含的像素點個數
plt.show()
(2)
plt.plot([0, 2, 4, 6, 8], [3, 1, 4, 5, 2]) # 依次爲橫縱座標
plt.ylabel("Grade") # y軸名稱
plt.axis([-1, 10, 0, 6]) # 橫縱座標範圍
plt.show()
pyplot繪圖區域
plt.subplot(nrows, ncols, plot_number)
# pyplot繪圖區域
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2 * np.pi*t)
a = np.arange(0.0, 5.0, 0.02)
plt.subplot(2, 1, 1) # 圖像分區
plt.plot(a, f(a))
plt.subplot(2, 1, 2) # 圖像分區
plt.plot(a, np.cos(2*np.pi*a), "r--")
plt.show()
pyplot的plot()函數
plt.plot(x, y, format_string, **kwargs)
x: x軸數據,列表或數組,可選
y:y軸數據,列表或數組
format_string: 控制曲線的格式字符串,可選 由顏色字符、風格字符、標記字符組成
顏色字符:
“b”藍色
“g”綠色
“r”紅色
“c”青綠色
“m”洋紅色
“y”黃色
“k”黑色
“w”白色
“0.8”灰度值字符串
風格字符:
“-”實線
“--”破折線
“-.”點劃線
“:”虛線
“”””無線條
標記字符:
“.”點標記
“,”像素標記(一個非常小的點)
“o”實心圈標記
“v”倒三角標記
“^”上三角標記
“>”右。。。
“<”左。。。
“1”下花三角標記
“2”上花三角
“3”左花三角
“4”右花三角
“s”實心方形標記
“p”實心五角標記
“*”星型標記
“h”豎六邊形標記
“H”橫六邊形標記
“+”十字標記
“x”x標記
“D”菱型標記
“d”瘦菱型標記
“|”垂直線標記
# plot函數使用具體
a = np.arange(10)
plt.plot(a, a, "go-", a, 2*a, "rx", a, 3*a, "*", a, 4*a, "b-.")
plt.show()
**kwargs: 第二組後更多(x, y, format_string)即繪製多條曲線
注意:當繪製多條曲線時,各條曲線的x不能省略
color:控制顏色,color=”green”
linestyle:線型風格,linestyle=”dashed”
marker:標記風格,marker=”o”
markerfacecolor:標記顏色,markerfacecolor=”blue”
markersize:標記尺寸,markersize=20
pyplot中文顯示
中文顯示方法一:
rcParams的屬性:
# 法(1)
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams["font.family"] = "SimHei" # SimHei爲中文黑體
plt.plot([3, 1, 4, 5, 2])
plt.ylabel("縱軸(值)")
plt.savefig("test", dpi=600) # 保存圖片
plt.show()
“font.family”顯示字體名字,
更多字體:’SimHei’爲中文黑體 ‘Kaiti’ 中文楷體 ‘LiSu’中文隸書 ‘FangSong’中文仿宋 ‘YouYuan’中文幼圓 ‘STSong’ 華文宋體
“font.style”字體風格,正常”normal”或斜體”italic”
“font.size”字體大小,整數字號或者”large”、”x-small”
# 更多字體
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family'] = 'STSong'
matplotlib.rcParams['font.size'] = 20
a = np.arange(0.0, 5.0, 0.02)
plt.xlabel('橫軸:時間')
plt.ylabel('縱軸:振幅')
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.show()
中文顯示方法二:
在有中文輸出的地方,增加一個屬性:fontproperties
好處:不是全局修改字體,比較靈活,推薦使用
# 方法二
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.xlabel('橫軸:時間', fontproperties='SimHei', fontsize=25)
plt.ylabel('縱軸:振幅', fontproperties='Kaiti', fontsize=25)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.show()
pyplot 文本顯示函數
plt.xlabel() 對x軸增加文本標籤
plt.ylabel() 對y軸增加文本標籤
plt.title() 對圖形整體增加文本標籤 (位於圖形正上方)
plt.text() 在任意位置增加文本
plt.annotate() 在圖形中增加帶箭頭的註解
# pyplot 文本顯示函數
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.xlabel('橫軸:時間', fontproperties='SimHei', fontsize=25, color='green')
plt.ylabel('縱軸:振幅', fontproperties='Kaiti', fontsize=25)
# $括起來的文字是LaTeX文本語法
plt.title(r'正弦波實例 $y=cos(2\pi x)$', fontproperties='SimHei', fontsize=35)
# plt.text(2, 1, r'$\mu=100$', fontsize=15) # 2, 1,表示文本放置的位置爲座標軸(2, 1)
# xy=(2, 1)表示箭頭所在座標,xytext=(3, 1.5)表示文本所在座標,arrowprops表示箭頭屬性
# 依次爲顏色、箭頭兩端留有有一定空白區域、箭頭寬度
plt.annotate(r'$\mu=100$', xy=(2, 1), xytext=(3, 1.5),
arrowprops=dict(facecolor='black', shrink=0.1, width=2))
plt.axis([-1, 6, -2, 2])
plt.grid(True) # 加入網格線
plt.show()
pyplot的子繪圖區域
plt.subplot() plt.subplot2grid()--------------->可以定製各個板塊區域大小
plt.subplot2grid(GridSpec, Curspec, colspan=1, rowspan=1)
目前用不到......
pyplot的基礎繪圖函數
plt.plot(x, y, fmt, ...) 繪製一個座標圖(也可以是極座標系)
plt.boxplot(data, notch, position) 繪製一個箱型圖
plt.bar(left, height, width, bottom) 繪製一個條形圖
plt.barh(width, bottom, left, height) 繪製一個橫向條形圖
plt.polar(theta, r) 繪製一個極座標圖
plt.pie(data, explode) 繪製餅圖
plt.psd(x, NFFT=256, pad_to, Fs) 功率譜密度圖
plt.specgram(x, NFFT=256, pad_to, F) 繪製譜圖
plt.cohere(x, y, NFFT=256, Fs) 繪製x -- y相關性函數
plt.scatter(x, y) 繪製散點圖,其中x和y長度相同
plt.step(x, y, where) 繪製步階圖
plt.hist(x, bins, normed) 繪製直方圖
plt.contour(X, Y , Z, N) 繪製等值圖
plt.vlines()繪製垂直圖
plt.stem(x, y, linefmt, markerfmt)繪製柴火圖
plt.plot_data()繪製數據日期
pyplot餅圖繪製(顯示各個數據直觀佔比)
# (1)pyplot餅圖繪製
import matplotlib.pyplot as plt
labels = "Frogs", "Hogs", "Dogs", "Logs" # 標籤
size = [15, 30, 45, 10] # 每份標籤所佔比例
explode = (0, 0.1, 0, 0.2) # 將餅圖中 30 部分突出出來顯示(突出比例爲0.1),依次類推
# pie圖中參數依次表示餅圖尺寸、突出部分、標籤、中間顯示百分數的方式、
# False表示二維圖,True表示三維(即存在陰影)、餅圖起始角度
plt.pie(size, explode=explode, labels=labels, autopct="%1.1f%%",
shadow=False, startangle=90)
plt.axis("equal") # 餅圖爲正形(沒有角度差異)
plt.show()
pyplot直方圖的繪製(連續型數值數據,顯示數據分佈情況)
說明:橫座標連續
plt.hist()
Matplotlib.pyplot中hist()的參數:
n, bins, patches = plt.hist(arr, bins=10, normed=0,facecolor='black', edgecolor='black',alpha=1,histtype='bar')
hist的參數非常多,但常用的就這六個,只有第一個是必須的,後面四個可選
arr: 需要計算直方圖的一維數組
bins: 直方圖的柱數,可選項,默認爲10
normed: 是否將得到的直方圖向量歸一化。默認爲0
facecolor: 直方圖顏色
edgecolor: 直方圖邊框顏色
alpha: 透明度
histtype: 直方圖類型,‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’
(1)單變量直方圖
# (2)pyplot直方圖的繪製
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0) # seed 種子可以產生一類隨機數(各種各樣,不過數據內容固定)
mu, sigma = 100, 20 # 設定均值和方差
a = np.random.normal(mu, sigma, size=100) # normal產生正態分佈數組
# 下列屬性依次爲,數組a、直方圖個數(bins -----> 條的個數)、normed=1表示每個方塊內元素出現的概率
# normed=0表示每個方塊內元素出現的數目、
plt.hist(a, bins=50, normed=1, histtype="stepfilled", facecolor="b", alpha=0.75)
plt.title("Histogram") # Histogram直方圖 --------> 標題
plt.show()
(2)雙變量直方圖繪製
說明:x, y 均爲變量,使用顏色深淺表示數量多少
# <2> 雙變量直方圖,顏色深淺表示數量(密度)
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(1000) + 2 # x軸中心爲2
y = np.random.randn(1000) + 5 # y軸中心爲5
plt.hist2d(x, y, bins=40) # 繪製雙變量
plt.show()
極座標圖繪製
待更......
pyplot散點圖的繪製(數據相關性的研究)
散點圖作用:繪出散點圖後可以幫助瞭解兩個變量的相關性(正相關、負相關、無關),比如,判斷商品兩個時間的價格(以兩個時間的價格爲橫縱座標描點繪圖)
法一:
# (4)pyplot散點圖的繪製,法一:直接使用plot繪製,法二:使用面向對象方法繪製
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots() # 括號爲空時表示繪製的圖形只有一個區域
ax.plot(10*np.random.randn(100), 10*np.random.randn(100), "o") # 橫縱座標均爲正態分佈數值*10,形狀爲o形
ax.set_title("Simple Scatter") # 標題
plt.show()
法二:
# 散點圖
import numpy as np
import matplotlib.pyplot as plt
# # 隨機散點圖
# n = 1000
# x = np.random.randn(n)
# y1 = np.random.randn(n)
# plt.scatter(x, y1)
# plt.show()
# 正相關散點圖
n = 1000
x = np.random.randn(n)
y2 = x + np.random.randn(n) * 0.5 # 若想變爲負相關,則在x前面加一個負號
plt.scatter(x, y2, s=15, c="r", marker=">", alpha=0.5) # s(面積) 可以修改點的大小,
# c(color顏色)修改顏色,marker修改點的形狀, alpha修改透明度(點過於集中時便於查看,點的分佈情況)
plt.show()
負相關
折線圖(數據隨時間的變化趨勢)
# 折線圖(數據隨時間的變化趨勢)
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 5) # 分爲五份
y = x**2
plt.plot(x, y)
plt.show()
條形圖(比較多個項目分類數據的大小)
比較不同季度的銷售
# 條形圖(比較多個項目分類數據的大小)
import numpy as np
import matplotlib.pyplot as plt
n = 5
y = [20, 30, 15, 10, 35]
index = np.arange(n)
# 橫向
plt.subplot(2, 1, 1)
p1 = plt.bar(left=index, height=y, color="r", width=0.5)
# 縱向
plt.subplot(2, 1, 2)
p2 = plt.bar(left=0, bottom=index, width=y, color="r", height=0.5, orientation="horizontal")
# orientation="horizontal"表示水平展示
# 橫向也可以是 p2 = plt.barh(left=0, bottom=index, width=y)
plt.show()
多組條形圖比較:
(1)並列比較
# 多組條形圖比較
import numpy as np
import matplotlib.pyplot as plt
index = np.arange(4)
sales_BJ = [52, 55, 65, 45]
sales_SH = [44, 36, 65, 41]
bar_width = 0.3
plt.bar(index, sales_BJ, bar_width, color="b")
plt.bar(index+1.5*bar_width, sales_SH, bar_width, color="r")
plt.show()
(2)層疊比較
# (2)層疊比較
import numpy as np
import matplotlib.pyplot as plt
index = np.arange(4)
sales_BJ = [52, 55, 65, 45]
sales_SH = [44, 36, 65, 41]
bar_width = 0.3
plt.bar(index, sales_BJ, bar_width, color="b")
plt.bar(index, sales_SH, bar_width, color="r", bottom=sales_BJ)
plt.show()
箱型圖(顯示數據分散情況)
說明:圖可以分爲上邊緣、上四分位數、中位數、下四分位數、下邊緣、異常值
# # 箱型圖(顯示數據分散情況)
# # <1> 繪製一個箱型圖
# import numpy as np
# import matplotlib.pyplot as plt
# np.random.seed(100)
# data = np.random.normal(size=1000, loc=0, scale=1)
# plt.boxplot(data, sym=".", whis=1.5) # sym 表示異常值點的形狀,whis表示異常值的範圍(默認爲1.5)
# plt.show()
# <2> 繪製多個箱型圖
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(100)
data = np.random.normal(size=(1000, 4), loc=0, scale=1)
labels = ["A", "B", "C", "D"]
plt.boxplot(data, labels=labels, sym=".")
plt.show()
圖像顏色和樣式修改
顏色:b :green g :green r :red c :cyan m :magenta y :yellow k :black w :white
(百度“顏色代碼”)
點樣式:. , o v ^ < > 1 2 3 8 s p * h H + D d | _
線樣式(只有四種):- 實線 -- 虛線 -. 點劃線 :點線
# 顏色和樣式修改
import numpy as np
import matplotlib.pyplot as plt
y = np.arange(1, 5)
# 樣式依次爲線型、顏色、點形狀(marker可以不寫,如果不寫不會劃線)
plt.plot(y, '--', color="b", marker=".")
plt.plot(y + 1, '-.', color="g", marker=",")
plt.plot(y + 2, ':', color="r", marker="o")
plt.plot(y + 3, '-', color="c", marker="v")
plt.plot(y + 4, color="m", marker="^")
plt.plot(y + 5, color="y", marker="<")
plt.plot(y + 4, color="k", marker="1")
plt.plot(y + 4, color="w", marker="3")
plt.show()
樣式字符串:將顏色、點型、線型寫成一個字符串
如:cx-- mo: kp-
# 樣式字符串:將顏色、點型、線型寫成一個字符串
import numpy as np
import matplotlib.pyplot as plt
y = np.arange(1, 5)
plt.plot(y, 'cx--')
plt.plot(y + 1, 'kp:')
plt.plot(y + 2, 'mo-.')
plt.plot(y + 3, 'k-')
plt.show()
面向對象繪圖
(1)pyplot畫法:
# pyplot畫法
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 1)
y = np.random.randn(len(x))
plt.plot(x, y)
plt.title("pyplot")
plt.show()
(2)面向對象畫法
生成多個子圖(一個figure):
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 100)
fig = plt.figure() # 添加畫板
ax1 = fig.add_subplot(221) # 添加座標軸,以及分區
ax1.plot(x, x) # 添加圖像
ax2 = fig.add_subplot(222)
ax2.plot(x, -x)
ax3 = fig.add_subplot(223)
ax3.plot(x, x**2)
ax4 = fig.add_subplot(224)
ax4.plot(x, np.log(x))
plt.show()
生成多圖(多個figure)
# 生成多圖(多個figure)
import matplotlib.pyplot as plt
import numpy as np
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
ax1.plot([1, 2, 3], [3, 2, 1])
fig2 = plt.figure()
ax2 = fig2.add_subplot(111)
ax2.plot([1, 2, 3], [1, 2, 3])
plt.show()
繪製網格
# 繪製網格
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 1)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, x*2)
ax.grid(color="g", linewidth=1.5, linestyle="--") # 依次爲設置顏色、網格線粗細、線型
plt.show()
圖例
# 圖例
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 11, 1)
fig = plt.figure()
ax = fig.add_subplot(111)
l, = plt.plot(x, x*2, label="Normal")
l1, = plt.plot(x, x*3, label="fast")
ax.plot(x, x*4, label="faster")
plt.legend(loc=0) # 顯示圖例
# (loc表示location,loc=1-----> 圖例在右上角顯示,
# loc=2表示圖例在左上角顯示,0。。。3。。。4。。。)
plt.show()
座標軸範圍調整
# 座標軸範圍調整
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-10, 11, 1)
figure = plt.plot(x, x*x)
plt.axis([-15, 15, 0, 50]) # 直接修改橫縱座標
# 只調節某一個軸
# plt.xlim([-10, 10])
# plt.ylim([0, 100])
# 只調節一邊
plt.xlim(xmin=-10)
plt.ylim(ymax=100)
plt.show()
調整座標軸刻度
# 調整座標軸刻度
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 11, 1)
plt.plot(x, x)
ax = plt.gca() # 獲取當前圖形座標軸
ax.locator_params(nbins=20) # nbins表示座標軸有多少格
ax.locator_params("x", nbins=5) # 只調整x軸
plt.show()
添加座標軸(雙y軸)
# 添加座標軸
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(2, 20, 1)
y1 = x*x
y2 = np.log(x)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(x, y1)
ax1.set_ylabel("Y1")
ax2 = ax1.twinx() # 繪製在同一x軸上(雙y 軸)
ax2.plot(x, y2, "r")
ax2.set_ylabel("Y2")
ax1.set_xlabel("compare Y1 and Y2")
plt.show()
註釋(插入箭頭以及文本)
# 註釋
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-10, 11, 1)
y = x*x
plt.plot(x, y)
# 屬性依次爲文本內容、箭頭起點、文本起點、箭頭顏色箭頭頭部寬度以及箭頭身體寬度
plt.annotate("this is the bottom", xy=(0, 5), xytext=(0, 50),
arrowprops=dict(facecolor="r", headwidth=10, width=2))
plt.show()
文字(只插入文字內容)
# 文字(只插入文字內容)
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-10, 11, 1)
y = x*x
plt.plot(x, y)
plt.text(-2, 40, "function: y = x*x ", family="fantasy", size=15, color="g", style="oblique")
# family表示字體樣式,size表示字號,顏色、style表示斜體與正體(默認爲正)
plt.show()
圖像美化
#
import matplotlib.pyplot as plt
import numpy as np
# 快速美化
plt.style.use("bmh") # ggplot是美化的版式,類似還有dark_background bmh (推薦) grayscale fivethirtyeight(推薦)
fig, axes = plt.subplots(ncols=2, nrows=2)
ax1, ax2, ax3, ax4 = axes.ravel()
x, y = np.random.normal(size=(2, 100))
ax1.plot(x, y, "o")
x = np.arange(0, 10)
y = np.arange(0, 10)
ncolors = len(plt.rcParams["axes.color_cycle"])
plt.show()