收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

数据可视化之美 -- 以Matlab、Python为工具

[复制链接]
. o9 O9 s: q2 i8 ?" K& m; o& m
# [: I1 j4 x/ V5 n
. u6 T5 |% R+ |! C) w% v
% E9 p; l. } {$ u! h

在我们科研、工作中,将数据完美展现出来尤为重要。

, t: C- `7 C2 M5 b

数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。

9 ~% u8 ~6 \" j$ l

下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。

; r. a" T. \" P8 i* r% e! R( C

Example 1 :散点图、密度图(Python)

" j$ z. L, q5 v/ g: D. s# T

import numpy as np

' p5 y( i& R. f t' K+ `

import matplotlib.pyplot as plt

/ n1 c* E J; o. X* U, P

# 创建随机数

$ W9 t0 i1 v' }! }- R

n = 100000

- n' ]3 q7 ?) w" ~/ C3 T' V

x = np.random.randn(n)

U( Y1 e8 l# ?: v3 s* ^5 n7 u

y = (1.5 * x) + np.random.randn(n)

& A, U$ Z7 ~/ X1 ?

fig1 = plt.figure()

$ l* T% t8 A' o4 D0 c

plt.plot(x,y,.r)

) h7 f- H) A& _! T! p$ U' f

plt.xlabel(x)

8 v9 O# Q& b! ~' r2 B- w

plt.ylabel(y)

$ u, P) v( c( z; ^

plt.savefig(2D_1V1.png,dpi=600)

1 I" V7 ?* D9 S% ^2 D3 \

nbins = 200

6 z" o) b+ B$ b9 w" z3 y

H, xedges, yedges = np.histogram2d(x,y,bins=nbins)

- d: D4 F5 m2 T8 _0 w

# H needs to be rotated and flipped

9 [+ v! s0 f1 ^

H = np.rot90(H)

- q! l2 V9 `+ i

H = np.flipud(H)

8 B" F7 o' @5 b

# 将zeros mask

3 i2 c1 T2 Z' C4 |

Hmasked = np.ma.masked_where(H==0,H)

6 C9 G0 O# J1 a6 R! _$ H

# Plot 2D histogram using pcolor

4 K- y7 x# C% d4 r3 W; R

fig2 = plt.figure()

% B G8 x% E! u# _

plt.pcolormesh(xedges,yedges,Hmasked)

6 U! w) t; |: x* L

plt.xlabel(x)

* m0 z7 j7 G6 r! m

plt.ylabel(y)

% n& k! g) k. A

cbar = plt.colorbar()

* C2 X6 A) `/ F

cbar.ax.set_ylabel(Counts)

0 Y+ `3 h- U+ I8 J7 u3 O

plt.savefig(2D_2V1.png,dpi=600)

" t+ o4 ?# @2 `" X3 W5 C

plt.show()

2 T U w) K7 q; b Y+ s
( a4 {1 A [! Y: Y7 e6 _) F
9 S* R8 t, r' H0 m2 w% D* c
打开凤凰新闻,查看更多高清图片
% U% T# V7 L3 p; ?# Z( D6 N9 x
" C" \$ C0 ~; a1 T& P3 _
" N' T+ s0 P, K- h5 c) J3 A' u

" u- @5 ]4 ]: m: [& h8 ~; {

Example 2 :双Y轴(Python)

$ T9 y8 ?/ H- _' g* Z7 T

import csv

: E0 w Z* s: D8 n- S

import pandas as pd

1 v5 _7 k# ^( s* ]2 f6 o

import matplotlib.pyplot as plt

/ a" _. _+ E6 P3 b& z

from datetime import datetime

& I8 h) ?2 |1 f i3 o; T0 x

data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)

9 b! @! h, M" E1 s6 J0 U" s B' B

time=data[date [AST]]

3 \- b' i. P6 K7 |9 h

sal=data[salinity]

m2 Y2 L% b2 w( D9 k: \6 L8 c) ]

tem=data[temperature [C]]

/ p: U7 _6 u; q

print(sal)

1 E3 I7 |& p l5 _3 R* x, J/ C

DAT = []

6 k. s" n X' g- T8 @

for row in time:

; Z& X8 F" {0 j: a1 z- h, D1 {

DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))

( K" L) ?- i" [+ p+ c! ?. E$ N

#create figure

g- i+ Y* }* p# J( C

fig, ax =plt.subplots(1)

. N6 l8 J' ^4 I1 w5 S1 ^, L

# Plot y1 vs x in blue on the left vertical axis.

4 s# X X3 D$ p8 L; N

plt.xlabel("Date [AST]")

+ z, {5 [+ N3 B4 d, ^& Y

plt.ylabel("Temperature [C]", color="b")

2 r+ F. ~; O& ?0 G7 w J

plt.tick_params(axis="y", labelcolor="b")

( m0 |7 w& G+ q+ z( x

plt.plot(DAT, tem, "b-", linewidth=1)

6 Q: l6 v0 A: K

plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")

) ~# n$ d% P0 E8 R6 D0 ?4 E9 p

fig.autofmt_xdate(rotation=50)

6 S1 g% |$ ~/ _0 Q9 R

# Plot y2 vs x in red on the right vertical axis.

, ]2 j- A, D2 \

plt.twinx()

% F! w2 T* {8 r @, S

plt.ylabel("Salinity", color="r")

! w8 V6 ?' e2 A1 m; m2 {& V0 @# {

plt.tick_params(axis="y", labelcolor="r")

' o. s( b3 I- `- s. R1 t

plt.plot(DAT, sal, "r-", linewidth=1)

) w9 {; g+ d) P, S* `: L' U; T

#To save your graph

9 p0 W9 c2 I# k" p8 L# S- C1 X* P

plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)

$ S) a% l3 \; C; w, Z- W5 v

plt.show()

, O+ `( b) R8 w

9 \2 Z# V& p) l1 f" F$ ?$ h

Example 3:拟合曲线(Python)

* ?; z9 |2 s5 k# e( f

import csv

8 e* t! R s& L$ C! y* F

import numpy as np

6 w, N* w2 s2 h1 ]- q

import pandas as pd

6 d" `+ P* F0 p, t X8 ^7 K3 r9 }

from datetime import datetime

* B$ C5 C' C" t4 i' E& O" D( n" L

import matplotlib.pyplot as plt

! j) K% q8 |( U. Y

import scipy.signal as signal

, Z1 |6 w- `7 e X! M

data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)

6 F" t' F5 Z% q5 O, F

time=data[date [AST]]

7 G3 l# R8 b4 e4 a5 D

temp=data[temperature [C]]

6 `% K5 Y8 z+ C4 @

datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")

& d# k( v8 _; w& g

DATE,decday = [],[]

6 A. U( p" p, z5 F

for row in time:

7 W E# z- i8 A. c. j3 G3 e: [( T

daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")

$ q( {0 K, \! ^7 K0 l4 p

DATE.append(daterow)

# }: z3 |' O0 w/ Q# S' q" R

decday.append((daterow-datestart).total_seconds()/(3600*24))

3 g9 X4 j+ ]/ _$ I

# First, design the Buterworth filter

- z6 Y2 L" r, o* ^% h

N = 2 # Filter order

6 l$ c3 J7 `8 S: R( t

Wn = 0.01 # Cutoff frequency

" O8 y! c) f! t) Q# C# w" B- f

B, A = signal.butter(N, Wn, output=ba)

' C1 n; w6 X2 K2 {

# Second, apply the filter

: T' r8 d$ w2 J5 i7 @

tempf = signal.filtfilt(B,A, temp)

2 c3 W( j4 K, W, G9 k

# Make plots

8 t3 f! F+ \0 v' P5 \8 l

fig = plt.figure()

; f4 b+ v; M+ s' v& t3 \1 f

ax1 = fig.add_subplot(211)

+ d. R* P' D0 Q

plt.plot(decday,temp, b-)

& ~) h) Y6 J( y0 q3 E

plt.plot(decday,tempf, r-,linewidth=2)

5 m/ }8 k& w3 b0 {5 w! @( |" q

plt.ylabel("Temperature (oC)")

# m2 E4 _5 R+ b$ o

plt.legend([Original,Filtered])

# Y5 M: G( U+ K7 ], K, c

plt.title("Temperature from LOBO (Halifax, Canada)")

! q* o$ C0 U4 r9 @

ax1.axes.get_xaxis().set_visible(False)

) P! a! B3 v5 v q$ h+ f4 X' r2 ~

ax1 = fig.add_subplot(212)

) e; a& u& S$ I

plt.plot(decday,temp-tempf, b-)

3 F' U; P' s) f' \

plt.ylabel("Temperature (oC)")

6 e A' a t# e

plt.xlabel("Date")

4 I5 l* g! E: h( }, L6 |- d

plt.legend([Residuals])

. h/ P$ W$ K4 ~8 P, [

plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)

7 o/ x$ u6 J, d( K: C6 H

plt.show()

; C. b6 ~ S; \8 @/ E

, O0 Y0 [! ~3 ?6 L: e

Example 4:三维地形(Python)

' }6 e4 G9 G) l8 j

# This import registers the 3D projection

- r3 D2 P& A3 {0 L- c

from mpl_toolkits.mplot3d import Axes3D

! [/ U; ?5 I) T/ c' r6 O6 Z4 c

from matplotlib import cbook

/ U6 K' \- s6 U( Z. G: Z

from matplotlib import cm

' D$ i4 {; u/ U; r

from matplotlib.colors import LightSource

& R/ F! C3 G7 o& w$ W+ l

import matplotlib.pyplot as plt

8 }7 R' J/ {: R

import numpy as np

, E' O' u* ~' c+ K/ \ _7 f

filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)

: A4 v+ d4 S5 h _! }3 o

with np.load(filename) as dem:

4 f: k1 E( S3 o. R

z = dem[elevation]

" i& I) {7 o6 `! T/ Q

nrows, ncols = z.shape

+ [$ G' [; D5 V: o8 ^

x = np.linspace(dem[xmin], dem[xmax], ncols)

) Q- X+ O) ?, L7 x2 r7 c

y = np.linspace(dem[ymin], dem[ymax], nrows)

1 i! N: g2 a A2 L6 Z! y3 }+ B L5 R

x, y = np.meshgrid(x, y)

2 Z f% I# A7 ?4 f% Z- s7 ^

region = np.s_[5:50, 5:50]

j/ d/ x& z3 N! ? O; j

x, y, z = x[region], y[region], z[region]

) f5 \7 I# E. J4 O

fig, ax = plt.subplots(subplot_kw=dict(projection=3d))

: [* {/ t% V" M- Q, w! ^

ls = LightSource(270, 45)

8 W4 a% _3 L. X

rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)

h1 J( a3 S4 g3 H

surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,

7 T% t" ~! q. q5 @# ]3 O7 y

linewidth=0, antialiased=False, shade=False)

8 I6 K X' Z: v) Q* K: M

plt.savefig(example4.png,dpi=600, bbox_inches=tight)

6 U8 s2 ~& l z% l

plt.show()

0 {7 ]7 t/ q6 o; A0 q. X 7 k9 k5 u& f. e! k. w0 U

Example 5:三维地形,包含投影(Python)

) x. M$ a$ \% H $ e8 y% M- p. ?) }2 [

Example 6:切片,多维数据同时展现(Python)

. ] P8 f& w$ ^6 k! `+ q8 l ( i- q! n- o, y6 Z& R$ O5 g" k

Example 7:SSH GIF 动图展现(Matlab)

7 { }2 f9 u5 n ; Y9 d; _- a0 h" w b" G

Example 8:Glider GIF 动图展现(Python)

/ L! q7 f1 [7 T0 v * y! }" v3 U8 P# k. B

Example 9:涡度追踪 GIF 动图展现

" ~% k% x" U$ q+ i( p : M. o4 P7 s7 X8 F
$ i! L7 U7 |% s7 P6 k/ Y8 o) e
( t9 e1 |! _9 [3 Y
* h/ E6 h6 [# f; y2 J' S 1 @) J s5 [' P- B2 c: M ' ^8 w% M4 f9 Z# D" ]" A . i. a) s% E7 }+ g : c9 Y! j# q' S
回复

举报 使用道具

相关帖子

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
為了你我愿給
活跃在昨天 11:21
快速回复 返回顶部 返回列表