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

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

[复制链接]
2 [/ P% p/ S6 W& W( n" B
/ D+ N5 u0 D8 m5 L' B9 f
0 G7 z( _' {6 V( R
' Z( r7 b' E- T* U1 J6 w8 \

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

( d: e9 |: M- Q, |3 [, e6 d

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

$ E* ?0 _6 b& U

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

; y& Z0 }0 v" A6 p( Z" e) o

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

' X$ V, v6 @( {8 K2 d8 \) x' x+ S% v

import numpy as np

- ]0 {: x& ]) J9 |, n: t* r

import matplotlib.pyplot as plt

, Y8 h! ~. ^3 ^) U

# 创建随机数

* ?1 B X) A& U" [" P

n = 100000

2 G/ O% F7 W9 z6 a" }5 | }

x = np.random.randn(n)

, W) i' L8 u4 T% M) _6 Q( H

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

7 s. b4 y% b0 I$ v; T9 v

fig1 = plt.figure()

( w7 `! N5 M& f. J& A

plt.plot(x,y,.r)

3 t5 h5 l t* V$ v n7 B

plt.xlabel(x)

0 W2 M* Y, m: A1 V7 D8 t

plt.ylabel(y)

3 d, ]. ^1 G+ O- ~1 p$ U

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

3 h2 B& H* d9 S7 \5 S

nbins = 200

4 p+ z. c7 b: o0 N2 [3 e

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

: K5 S& F1 P; c! \

# H needs to be rotated and flipped

' J9 g, C0 j/ B1 U. z& a( n! x2 H1 e0 B

H = np.rot90(H)

9 A& C1 D& z/ q8 F" |& _

H = np.flipud(H)

e& H2 W& ^$ k3 k4 ~$ b

# 将zeros mask

* e/ R* @8 p- M1 p- N3 ~

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

% W5 W7 A$ }4 m* G& r+ D6 }% l8 N m& r# y

# Plot 2D histogram using pcolor

/ \# T+ h# O, x/ C

fig2 = plt.figure()

. C0 g5 W4 b$ I

plt.pcolormesh(xedges,yedges,Hmasked)

1 j# p4 A1 M. [

plt.xlabel(x)

m8 M. f0 d1 `! S

plt.ylabel(y)

' C0 C, ]( P: W+ B

cbar = plt.colorbar()

7 v( M+ x8 `+ U8 K, ~' Q2 B

cbar.ax.set_ylabel(Counts)

* m0 K0 Y' [* h4 e, g

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

$ d$ j9 X( [9 I6 G

plt.show()

, X& }' a8 T0 L8 j% O! i: i6 }
* w. e' e- n6 }/ g! g& `
% y5 O) O+ k- u8 \
打开凤凰新闻,查看更多高清图片
( o% {( i$ V$ \) e. U
2 ^ P8 I: R, f+ U1 B, e; p
* `$ q& E# T9 K) A) G5 f' j! v

2 d) w/ M- I7 P+ {: `3 y

Example 2 :双Y轴(Python)

9 e& t/ a2 {" [& {; _

import csv

; A* j( F$ G1 K

import pandas as pd

9 p j) Y3 F. @8 [/ J/ f; d

import matplotlib.pyplot as plt

+ `( w! j+ h6 f, P- C! S

from datetime import datetime

% l* H' Z5 \" o" |5 f

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

?( P/ x5 i l, y( s/ _ Q; N

time=data[date [AST]]

. k8 M) y6 |% _' S F0 [* ?

sal=data[salinity]

2 A8 Y8 e: D; ^9 a- z9 A2 E! Z2 {

tem=data[temperature [C]]

8 r$ k& t ]. e* S T

print(sal)

) t- i& X! u( `, n7 \6 D: d

DAT = []

# ?! D m/ @" v, @8 X( P

for row in time:

" c- A* S" n- f. ]

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

0 ?' ^6 T: I6 K* F$ V7 M

#create figure

* V. g A; ^- ~3 H; `8 Q5 b4 n* [

fig, ax =plt.subplots(1)

5 k( p( A! c; m4 O

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

* b7 f" @+ T: L- C4 U0 V; n3 z

plt.xlabel("Date [AST]")

2 K3 t5 z2 t' P' ^1 c: ]. Z6 b

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

0 \2 o- r! J4 R

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

- |' b! a0 A% K2 M7 `

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

# _, U9 o7 H" b* D, L; v }9 t+ L" m

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

: ]. u, J1 d+ w! s5 X

fig.autofmt_xdate(rotation=50)

' w; g! C: T. R

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

; h: |7 E; h* k( {

plt.twinx()

1 {& {3 t2 v9 }

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

: h1 l6 T1 C! S

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

, r+ k* r& ~, n) D* L( U% ~

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

- J4 a5 o# L7 ]( a. Y

#To save your graph

" {" ]( J |1 f! J* @

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

, {( O- h/ P1 I; n# @

plt.show()

8 Z( x" w: I2 Y9 w

' t4 P% b. d Y0 a+ T- p7 V! T' o

Example 3:拟合曲线(Python)

, W9 t9 Y1 K! d8 h8 r7 t

import csv

- _0 v" [4 f) f8 A

import numpy as np

3 b2 Y1 e) E9 e* e& m$ a

import pandas as pd

) D" B) X9 o2 s: j1 Y7 b

from datetime import datetime

G) q' R; W$ q5 z8 M. H

import matplotlib.pyplot as plt

( h2 f6 s1 d7 C, A K( x

import scipy.signal as signal

0 _; |; q5 z1 I$ X

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

" ]3 Z- Z* q& O9 Q5 Y. H

time=data[date [AST]]

. u; y" j) p" T5 i& W

temp=data[temperature [C]]

* W6 n' C6 O' ] `* Q5 n/ y

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

# ?, W8 ]& M. L/ v/ E9 l& a0 ?- B

DATE,decday = [],[]

" E% ~5 e2 D/ R7 |; H- e" c

for row in time:

) W. n, P1 Z5 {' c

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

. ^/ Y9 y% P; \+ V; }

DATE.append(daterow)

3 Q9 q2 d3 q* I

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

0 h% H/ h. x( j. W3 H- T. e! {3 |8 c

# First, design the Buterworth filter

, ]( D. C+ t- I6 g1 r

N = 2 # Filter order

# n/ |1 |/ {) N0 u' i

Wn = 0.01 # Cutoff frequency

; g) a: K s' Z% y

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

: E7 L5 B2 t6 o' P$ N$ C' l/ s

# Second, apply the filter

3 J2 Y6 i, [1 L& p$ d P; P

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

4 C" \( Q- d- N( j W' `& I

# Make plots

E J, J( [9 A4 C% q

fig = plt.figure()

4 K6 @; b4 { g2 m: R7 \

ax1 = fig.add_subplot(211)

, r+ C2 z* H+ ^( m2 m# q

plt.plot(decday,temp, b-)

3 L" z4 [+ c6 `, F

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

) h' ]1 J' [" R; N

plt.ylabel("Temperature (oC)")

' ]: b6 W% k+ V; k* q8 a b

plt.legend([Original,Filtered])

1 ?( x4 {- T* m2 Q

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

8 {0 x+ I! c+ N! D& I2 d6 A' t

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

6 ~0 J+ i8 \7 S' F. `8 i, i4 `( E

ax1 = fig.add_subplot(212)

( c: F' v& K; m" p

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

! P. `' q g B$ V

plt.ylabel("Temperature (oC)")

& V0 N5 d/ k" M

plt.xlabel("Date")

/ y0 i+ w3 G8 f8 m. N; i8 o: j: n

plt.legend([Residuals])

" G, S7 x" t/ S

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

, ~8 p/ }8 i# K4 U. C8 @# M

plt.show()

$ D8 Q/ _/ `/ x$ a1 y

; d! v$ j4 i0 s0 X) L. Q. i6 d/ k

Example 4:三维地形(Python)

: M" J2 I- I- ~# \

# This import registers the 3D projection

9 l# F' s2 g7 b: L1 k9 t/ v

from mpl_toolkits.mplot3d import Axes3D

+ u( ? g5 ^2 g0 C- ?2 T" R

from matplotlib import cbook

, S3 r: b. A0 O

from matplotlib import cm

/ E Z! Z* o8 E

from matplotlib.colors import LightSource

! F8 {5 |+ C( X- q' Y

import matplotlib.pyplot as plt

- o$ M: f2 j& X5 g$ T4 t

import numpy as np

* b7 w6 N' {5 H* T& Q; k

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

9 ^2 b" [3 i- ?2 e, f

with np.load(filename) as dem:

" d/ Y: m' x3 y

z = dem[elevation]

R8 H! l. T9 S4 |+ i) z

nrows, ncols = z.shape

, x( l: \- O" c/ K$ }% Q9 \" }

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

6 [$ E( d4 q' R5 l8 o# h9 |7 ]

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

3 F2 ]5 D g/ k1 R+ I1 M

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

, t5 v N2 f u9 z% |/ {

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

" r: } b3 i+ l% z' \3 P7 r

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

. P Y' f4 b: p! s) X, i

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

! g ], E1 U( X

ls = LightSource(270, 45)

% G) q+ D, r% J" P2 ~) E

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

" m4 L( `% D: B6 B* J+ |

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

3 ~' l! n, [0 A* c' d

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

5 c9 D3 T1 A! D" w" l9 ]

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

( b" k8 C6 k2 k

plt.show()

& k* t" {9 n& U$ ? % O9 g* p. ^8 k6 U" u3 I0 H: i

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

2 e1 T* O/ ?, B3 l1 ~/ j ! [8 P: B( P/ d4 m( J6 X6 |

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

9 w0 x$ Q: K1 B0 X # c1 ]: b( T" \2 D' \7 h+ H

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

8 n* e L' h7 s8 V " B4 ]! H$ F9 x& p, \* N

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

4 H) P# G1 K0 e1 `. a. V : u7 X6 G* ^3 L6 b; ^0 K! v

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

: e3 }, w$ O O0 g; C& A: B) U- Q# p 4 r8 c; [! X8 ^% h# \( G$ F& c
; y1 g, N2 z( S* m) ~. h
& `, ~; ~0 v1 u: {0 u, D
$ z" ^7 o7 N y2 S . F ~# a- t$ W0 H 8 X. l) [$ A/ n2 F# ^$ C7 \$ y / d; {1 e* V3 H9 U2 Y+ c H% [. m: g {( G& i
回复

举报 使用道具

相关帖子

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