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

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

[复制链接]
2 |5 D( ~; G9 T) \
! H) W, c) ]1 G% m( w( I* ]
9 T" e( c4 z3 A4 K" v+ S! a2 y2 f: G
3 S1 O; T" c |5 W( z/ ^, e+ V% {

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

9 _; _7 M/ u9 K; _0 k

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

: A* ]1 a8 w: Y4 O7 k1 f

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

4 h7 ?$ i* o) g' y

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

' m! U; v# \6 _; x

import numpy as np

6 X O- A# c- Q& [- [

import matplotlib.pyplot as plt

: |- s1 n# K! t& q

# 创建随机数

0 j* T1 O2 g* c) D3 A/ Q

n = 100000

- `' ~* i; i6 l/ A& }

x = np.random.randn(n)

" `4 R) M, e( ]

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

d7 R5 N4 i0 C8 P

fig1 = plt.figure()

- P5 P4 Z% f5 Z- j" M# W

plt.plot(x,y,.r)

. e2 `5 b8 c; `, Q4 \

plt.xlabel(x)

# W- m9 s* [( ~: P# `: N

plt.ylabel(y)

0 M3 n% L8 Z. Y9 G) @8 B/ n- n' x

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

+ u8 J X8 k" q; p- h/ I

nbins = 200

! c8 M- l' [& H& E

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

/ t5 Q/ W" i- \6 y5 z- H& W

# H needs to be rotated and flipped

( X v+ c) |9 J) ~

H = np.rot90(H)

4 x% R. V/ J# v0 ?4 N! l2 q- o# F

H = np.flipud(H)

: n; d* g+ ~) a; ?6 D8 \5 @

# 将zeros mask

+ K" ?3 O. G |7 m/ [$ H) G/ F

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

" z% H* N w3 e% g" x/ [$ |. Y8 Z

# Plot 2D histogram using pcolor

/ ]4 w; U p5 f! B1 d

fig2 = plt.figure()

) l4 S% D( z- P/ G$ f, B

plt.pcolormesh(xedges,yedges,Hmasked)

2 m, e3 n" w, s! H! J8 T

plt.xlabel(x)

& ]9 E' E4 ^0 l+ A

plt.ylabel(y)

3 M( i3 F, r9 p' z

cbar = plt.colorbar()

9 U8 |4 e7 `) p& F: H! H: z) l. c

cbar.ax.set_ylabel(Counts)

( o, I7 g% {( y* L+ x

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

, X& o9 h \% W

plt.show()

" i. m2 n a% b* W) w% U
3 L4 H) v. x' y: u% [, T
& x' t9 ^7 b. ^; R$ J
打开凤凰新闻,查看更多高清图片
- L: ^8 ^* c& a+ ~6 `! x
7 d! g5 q& F; d. O1 v ~& g. B
, P; ]. M# i2 i% h& Z9 {& i

; f2 h4 b+ k e4 W9 h

Example 2 :双Y轴(Python)

/ |/ k0 n; j6 x0 G& s Q i2 t$ u s

import csv

& c9 U- ^( r. a$ r. I

import pandas as pd

' a3 |0 v% p& R

import matplotlib.pyplot as plt

( z3 D9 P( Q% B0 w$ A0 E5 G6 X

from datetime import datetime

5 c# X& i) Q- U- H; a. s6 [

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

) h V5 D) ?" W' y! F. j

time=data[date [AST]]

$ }/ A% q$ c# G3 B/ U# Z

sal=data[salinity]

9 Y& ^, s; `% b T

tem=data[temperature [C]]

2 Y! z8 I. ?6 t( {

print(sal)

. f8 ~8 [4 }; k, V

DAT = []

- n: ?& W) `. a( o/ b

for row in time:

5 V7 P; ^8 }7 |1 ~, l+ {

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

' | p0 e/ ]4 W5 W ?" ]4 o, @8 g

#create figure

4 k2 ?, f' e' \

fig, ax =plt.subplots(1)

/ p1 F, j+ w2 ?& x, M& a" l. y T( S+ g

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

' a5 K: f- g! Q. c; g# C2 }1 t

plt.xlabel("Date [AST]")

% P$ T* Y5 ]0 W# `3 F; A

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

. n4 _! A4 T& x* m2 X

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

5 B& `5 m6 q5 Y! ? c9 u

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

, l) A ^/ I4 d* Q+ z! b

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

# }; k! y% y$ Q, d

fig.autofmt_xdate(rotation=50)

! H6 |; U' c% S

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

$ H$ J" V: X$ O* f* t( P( }

plt.twinx()

6 n; q6 B8 |- M9 `# ^

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

2 n1 b2 V5 W* g* {; W/ | }

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

4 |3 D9 _8 k8 y5 A5 N0 L

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

7 d0 y9 O9 N7 T- @' ~

#To save your graph

+ ]" w" w) M: r7 `6 T) x

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

- ^3 ~1 [5 O- h

plt.show()

2 E) b* P: X* z& `/ w5 |3 s

4 E' y: V" {$ J- ^4 \& q! w0 P

Example 3:拟合曲线(Python)

+ z# _. x- j; k5 i

import csv

4 h$ w2 m+ A5 |

import numpy as np

, \& ?% C9 }7 B

import pandas as pd

4 Q6 Y6 \) S$ o* v

from datetime import datetime

! ~- ]& J: o. I' Y2 Z' r* S

import matplotlib.pyplot as plt

8 X5 n0 H% ^* ]1 M$ e% N

import scipy.signal as signal

# ^; c5 h1 z" h

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

9 ]4 c6 t; J" k! C

time=data[date [AST]]

- o% J( I' T% J) L. u

temp=data[temperature [C]]

( n# I' C* c0 Y1 T

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

2 B4 F& n3 i: N* r

DATE,decday = [],[]

: B0 n: H6 h: \* m7 |$ O# E& Z

for row in time:

, d: E- Z6 N, X6 e" C2 c0 Q3 A# ?

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

5 O5 o0 N. x- G% q2 Q# r4 O

DATE.append(daterow)

; s# N8 ?+ h; L2 s5 ]& A O

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

2 W1 M: {$ }. m+ b }

# First, design the Buterworth filter

* M& W% k. J% z# o$ Y& o

N = 2 # Filter order

! M. d& V& D9 C. M' ]

Wn = 0.01 # Cutoff frequency

( |+ I7 f7 z J E( e7 f# u. F/ R

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

$ F8 e2 a9 h" v- e" P

# Second, apply the filter

* }) X* Q0 u' H& ]: k/ [

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

& n7 j& N" r( T' R c }

# Make plots

. H1 V$ I6 `2 Z, C* V0 p

fig = plt.figure()

! {& D* s1 p. q" ?: K$ c8 e( V# x

ax1 = fig.add_subplot(211)

' Y1 a: K, B* ^' J

plt.plot(decday,temp, b-)

; _$ X, ^: j) x3 h

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

) d1 q$ t5 z3 e: x+ T& v

plt.ylabel("Temperature (oC)")

" S- i i$ a% o( x: q: x& B' ~+ k/ Q

plt.legend([Original,Filtered])

: x! M9 h$ D* e

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

! x G3 c4 t( N& z

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

6 V+ t0 M0 G' V

ax1 = fig.add_subplot(212)

% X2 @% F. X1 k1 y# q; V

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

- P2 Z; b, ~3 r$ j/ L

plt.ylabel("Temperature (oC)")

" K- r/ P9 ]2 r

plt.xlabel("Date")

, z5 x1 k/ \$ p- j9 T! w- I3 p& Z# |

plt.legend([Residuals])

/ J- p2 V) ]0 T1 M- o

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

# m% L" v$ [- v/ B+ \

plt.show()

! ?$ [* F& v" R2 g- B

% y) h' t* N% R# c0 ?* ]

Example 4:三维地形(Python)

: l5 v$ C- T: c% V q

# This import registers the 3D projection

4 n p8 q7 P N" Z8 H6 l

from mpl_toolkits.mplot3d import Axes3D

: ^! C+ s, U( ^2 k

from matplotlib import cbook

2 b$ q$ \4 @+ u. M8 k" g1 h

from matplotlib import cm

# P! P: z1 }' O3 u Z1 ?

from matplotlib.colors import LightSource

9 q' R5 y0 I+ m6 |7 h

import matplotlib.pyplot as plt

: B) r3 \4 a4 d3 c

import numpy as np

# Q; S2 N, c9 }0 p! s! S

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

8 D [$ m2 m1 u8 m

with np.load(filename) as dem:

! `, B8 i" p7 C1 }

z = dem[elevation]

5 N: O7 K5 l6 S$ d( H

nrows, ncols = z.shape

0 T8 C1 S5 I: b8 M g' _

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

+ @( ~( p$ p. W7 c

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

9 \$ }$ j' O1 Z, g+ O

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

: q6 j: X+ ?. n9 Y

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

2 F! w4 Z! ~2 t5 r& L: V' b' H

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

5 l2 N# r' d* }

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

; e0 r" B+ T3 K% f8 ^1 ?. p1 m

ls = LightSource(270, 45)

- d& J* f$ `/ @: u, N4 }, r

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

5 ~3 t' ?2 u. m9 r% t1 n; d1 A

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

! ?* Z2 d4 B+ a" N" F

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

r8 b# x. i1 k1 v

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

( ]4 [4 u; L- g. B% `

plt.show()

]& X: m+ a* r S% h/ O, _9 w/ Z" g; W

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

" h( N# w B: u) Y9 S 3 _; A: ~$ w% |' p$ s

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

3 h/ V {$ `$ X* L# [, K * M, h$ M# @ j; N, \

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

* M! o5 y- Y$ \$ u$ N& K+ d % I' y. |2 z2 z' D9 E' I

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

- |# @5 F$ g9 N+ q2 V+ z: E# n - c, Y3 {/ N. p* Z @

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

8 v- c, |% E1 r9 X2 r9 I- k1 o, r3 E " [! z+ r, P1 }4 h4 ^4 s
: _: W1 E, J' n, k" F; l _
7 G4 W* P6 u X8 i# |
; {* K2 u. u- [: @0 q3 [/ a2 y _0 E. f; X A7 X, H E1 m# ]# q3 f: R9 O4 a7 K$ B # T/ j: a3 H, ~6 M$ Q% Y " f' T/ b) k" Q: C, f
回复

举报 使用道具

相关帖子

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