python Matplotlib 學習筆記(2)

主要內容摘抄自 https://zhuanlan.zhihu.com/p/24309547

感謝大大。

# -*- coding: utf-8 -*-
# __author__ = 'wangxuhao'
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# 通過rcParams設置全局橫縱軸字體大小
mpl.rcParams['xtick.labelsize'] = 24
mpl.rcParams['ytick.labelsize'] = 24

np.random.seed(42)

# x軸的採樣點
x = np.linspace(0, 5, 100)

# 通過下面曲線加上噪聲生成數據,所以擬合模型就用y了……
y = 2*np.sin(x) + 0.3*x**2
y_data = y + np.random.normal(scale=0.3, size=100)

# figure()指定圖表名稱
plt.figure('data')

# '.'標明畫散點圖,每個散點的形狀是個圓
plt.plot(x, y_data, '.')

# 畫模型的圖,plot函數默認畫連線圖
plt.figure('model')
plt.plot(x, y)

# 兩個圖畫一起
plt.figure('data & model')

# 通過'k'指定線的顏色,lw指定線的寬度
# 第三個參數除了顏色也可以指定線形,比如'r--'表示紅色虛線
# 更多屬性可以參考官網:http://matplotlib.org/api/pyplot_api.html
plt.plot(x, y, 'k', lw=3)

# scatter可以更容易地生成散點圖
plt.scatter(x, y_data)

# 一定要加上這句才能讓畫好的圖顯示在屏幕上
plt.show()


# -*- coding: utf-8 -*-
# __author__ = 'wangxuhao'
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams['axes.titlesize'] = 20
mpl.rcParams['xtick.labelsize'] = 16
mpl.rcParams['ytick.labelsize'] = 16
mpl.rcParams['axes.labelsize'] = 16
mpl.rcParams['xtick.major.size'] = 0
mpl.rcParams['ytick.major.size'] = 0

# 包含了狗,貓和獵豹的最高奔跑速度,還有對應的可視化顏色
speed_map = {
    'dog': (48, '#7199cf'),
    'cat': (45, '#4fc4aa'),
    'cheetah': (120, '#e1a7a2')
}

# 整體圖的標題
fig = plt.figure('Bar chart & Pie chart')

# 在整張圖上加入一個子圖,121的意思是在一個1行2列的子圖中的第一張
ax = fig.add_subplot(121)
ax.set_title('Running speed - bar chart')

# 生成x軸每個元素的位置
xticks = np.arange(3)

# 定義柱狀圖每個柱的寬度
bar_width = 0.5

# 動物名稱
animals = speed_map.keys()

# 奔跑速度
speeds = [x[0] for x in speed_map.values()]

# 對應顏色
colors = [x[1] for x in speed_map.values()]

# 畫柱狀圖,橫軸是動物標籤的位置,縱軸是速度,定義柱的寬度,同時設置柱的邊緣爲透明
bars = ax.bar(xticks, speeds, width=bar_width, edgecolor='none')

# 設置y軸的標題
ax.set_ylabel('Speed(km/h)')

# x軸每個標籤的具體位置,設置爲每個柱的中央
ax.set_xticks(xticks+bar_width/2)

# 設置每個標籤的名字
ax.set_xticklabels(animals)

# 設置x軸的範圍
ax.set_xlim([bar_width/2-0.5, 3-bar_width/2])

# 設置y軸的範圍
ax.set_ylim([0, 125])

# 給每個bar分配指定的顏色
for bar, color in zip(bars, colors):
    bar.set_color(color)

# 在122位置加入新的圖
ax = fig.add_subplot(122)
ax.set_title('Running speed - pie chart')

# 生成同時包含名稱和速度的標籤
labels = ['{}\n{} km/h'.format(animal, speed) for animal, speed in zip(animals, speeds)]

# 畫餅狀圖,並指定標籤和對應顏色
ax.pie(speeds, labels=labels, colors=colors)

plt.show()


# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
# 3D圖標必須的模塊,project='3d'的定義
from mpl_toolkits.mplot3d import Axes3D     

np.random.seed(42)

n_grids = 51        	# x-y平面的格點數 
c = n_grids / 2     	# 中心位置
nf = 2              	# 低頻成分的個數

# 生成格點
x = np.linspace(0, 1, n_grids)
y = np.linspace(0, 1, n_grids)

# x和y是長度爲n_grids的array
# meshgrid會把x和y組合成n_grids*n_grids的array,X和Y對應位置就是所有格點的座標
X, Y = np.meshgrid(x, y)

# 生成一個0值的傅里葉譜
spectrum = np.zeros((n_grids, n_grids), dtype=np.complex)

# 生成一段噪音,長度是(2*nf+1)**2/2
noise = [np.complex(x, y) for x, y in np.random.uniform(-1,1,((2*nf+1)**2/2, 2))]

# 傅里葉頻譜的每一項和其共軛關於中心對稱
noisy_block = np.concatenate((noise, [0j], np.conjugate(noise[::-1])))

# 將生成的頻譜作爲低頻成分
spectrum[c-nf:c+nf+1, c-nf:c+nf+1] = noisy_block.reshape((2*nf+1, 2*nf+1))

# 進行反傅里葉變換
Z = np.real(np.fft.ifft2(np.fft.ifftshift(spectrum)))

# 創建圖表
fig = plt.figure('3D surface & wire')

# 第一個子圖,surface圖
ax = fig.add_subplot(1, 2, 1, projection='3d')

# alpha定義透明度,cmap是color map
# rstride和cstride是兩個方向上的採樣,越小越精細,lw是線寬
ax.plot_surface(X, Y, Z, alpha=0.7, cmap='jet', rstride=1, cstride=1, lw=0)

# 第二個子圖,網線圖
ax = fig.add_subplot(1, 2, 2, projection='3d')
ax.plot_wireframe(X, Y, Z, rstride=3, cstride=3, lw=0.5)

plt.show()


# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np

from mpl_toolkits.mplot3d import Axes3D

np.random.seed(42)

# 採樣個數500
n_samples = 500
dim = 3

# 先生成一組3維正態分佈數據,數據方向完全隨機
samples = np.random.multivariate_normal(
    np.zeros(dim),
    np.eye(dim),
    n_samples
)

# 通過把每個樣本到原點距離和均勻分佈吻合得到球體內均勻分佈的樣本
for i in range(samples.shape[0]):
    r = np.power(np.random.random(), 1.0/3.0)
    samples[i] *= r / np.linalg.norm(samples[i])

upper_samples = []
lower_samples = []

for x, y, z in samples:
    # 3x+2y-z=1作爲判別平面
    if z > 3*x + 2*y - 1:
        upper_samples.append((x, y, z))
    else:
        lower_samples.append((x, y, z))

fig = plt.figure('3D scatter plot')
ax = fig.add_subplot(111, projection='3d')

uppers = np.array(upper_samples)
lowers = np.array(lower_samples)

# 用不同顏色不同形狀的圖標表示平面上下的樣本
# 判別平面上半部分爲紅色圓點,下半部分爲綠色三角
ax.scatter(uppers[:, 0], uppers[:, 1], uppers[:, 2], c='r', marker='o')
ax.scatter(lowers[:, 0], lowers[:, 1], lowers[:, 2], c='g', marker='^')

plt.show()






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