python_matplotlib繪圖

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橫六邊形標記

+十字標記

xx標記

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字體大小,整數字號或者largex-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()

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章