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

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

[复制链接]
3 u; O( p; `) B0 h3 P
% X1 [+ F* y5 d N! }
$ Q- l% P' e- d; o8 C" N8 e1 Y
, d F" T+ ^( O4 S7 ?

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

/ p8 O/ Q' _0 Y9 R# Y d8 Z

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

- h* d7 m- b# k

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

( D; I% D7 ~0 O5 ]8 q% d( K0 [! i

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

* o! K n/ p* ?$ [' ~

import numpy as np

6 f# T3 ]$ {) S+ F6 [0 S2 A. `- j

import matplotlib.pyplot as plt

' C2 y$ E( Y, I* G

# 创建随机数

3 j7 w; S2 w% D4 b& X, n

n = 100000

0 X v; u3 D% l1 m" A

x = np.random.randn(n)

& n( c$ j s/ }4 f7 P2 H

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

. ]! o O0 l7 i

fig1 = plt.figure()

0 H+ \2 h# g% h6 F& Q# w! l

plt.plot(x,y,.r)

. y: c8 p) {5 M4 h p

plt.xlabel(x)

7 w! [; ~4 I! M3 W0 M( \' T3 K

plt.ylabel(y)

& ?3 P- O1 V( h# W! Q$ M

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

4 u g$ @( m* H9 J4 Q8 P& X

nbins = 200

: m- m% D& X' I: O' E

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

0 H; j: v1 Z5 U! O

# H needs to be rotated and flipped

( v# k! q! \6 W! A! }& S

H = np.rot90(H)

% n/ c. l6 u3 u) `

H = np.flipud(H)

* a3 Q$ y" H# d+ {& i; d6 b: f

# 将zeros mask

7 f9 O3 \- p( o" C6 G

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

' Q" i1 m6 a$ o0 d Y I

# Plot 2D histogram using pcolor

. k% @6 Z" E' y: S; @

fig2 = plt.figure()

9 H& \. s I8 H- G" ^

plt.pcolormesh(xedges,yedges,Hmasked)

4 J6 e0 p/ H+ q- H5 L

plt.xlabel(x)

0 p0 X! M. _; E, ^* Y" V0 o/ o: F

plt.ylabel(y)

3 J" w# u) G4 U( M2 A# G

cbar = plt.colorbar()

F7 ?- C* C9 l- ?: h4 w* P: n

cbar.ax.set_ylabel(Counts)

1 v, ~: N4 t/ k8 c, d( V3 z

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

4 U! o2 ~# L3 l* f$ n

plt.show()

@# H8 { |7 c
& k) N v+ H' }% V& `
" Q- H) u2 M, ]. ^1 w
打开凤凰新闻,查看更多高清图片
5 ] R/ `6 V- q g
# i* X1 b7 {* L
6 y6 v0 u/ M$ u+ E7 g7 K9 z

, _( D5 }" O% A7 p7 J& P0 ~/ n/ J

Example 2 :双Y轴(Python)

* _" L( h7 r7 [* J6 k) f9 s

import csv

1 y @! I# r6 o# [( e2 ]

import pandas as pd

8 U8 Y4 \) h, H4 h

import matplotlib.pyplot as plt

% P1 y0 P9 T3 z# u# W& g

from datetime import datetime

) T; G! M: d9 V1 K4 d

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

! S) A. F+ j7 A4 ?) F2 X

time=data[date [AST]]

) r0 @0 |# `+ d1 f

sal=data[salinity]

+ \) Q$ O( D4 p

tem=data[temperature [C]]

) |$ q# G; n7 y# b6 e

print(sal)

3 O4 d( b6 ~8 t" W5 l* x

DAT = []

$ i% b3 d1 z7 y& g

for row in time:

. D2 x) S# E- s& M1 `5 B5 \6 k8 _% O M

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

" b/ R3 J) C. I: P! n" v6 K' s

#create figure

( A" @! E8 M' j- u' G

fig, ax =plt.subplots(1)

. \8 l3 G1 o8 _. {' D

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

, b; G7 o! A$ Y/ D8 T( G$ W6 G" D

plt.xlabel("Date [AST]")

5 S# C& d) c- t

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

4 p" x+ s# D. ?( R$ v% b

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

& m( o! j; U( L+ I$ h1 I3 L. k

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

9 Z$ E! p; t1 }9 O% J4 m8 J

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

$ m' {' d0 Y- p# `

fig.autofmt_xdate(rotation=50)

* V) }( i X5 N8 Y

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

' v0 T# q# r2 A4 J& v

plt.twinx()

% o2 s* J" J3 P. `

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

: E) d* r/ t! y3 G8 H

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

$ v9 f" x0 \6 f" W% m

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

. Q6 L7 i( J- p9 c

#To save your graph

4 Q) o7 R3 A- l9 {# l

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

* b0 _; ?. q% \- b

plt.show()

+ y" K0 @/ ]# R$ o6 A d" C

; {' m8 @6 l" d% C4 H

Example 3:拟合曲线(Python)

: b% \& X$ {1 z) C1 h& O

import csv

: {% i, V2 }1 W% }3 b9 E8 G* \

import numpy as np

3 ?( g* s' c* X" L! D

import pandas as pd

9 P' ]+ X X, ~ [0 _

from datetime import datetime

E3 s$ i8 _! C( `' H5 ^1 `

import matplotlib.pyplot as plt

' R. }7 M5 a8 T; X& F

import scipy.signal as signal

/ V: }/ O' W: j6 F& k2 {7 J" E

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

! J1 o+ h3 {- j$ ]/ a- d( Q

time=data[date [AST]]

0 c g& Y! a& Q* k0 h. }& T

temp=data[temperature [C]]

2 e* c) L7 H" k( U, g$ h3 ?- U

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

+ W, O4 u: B$ y; B8 W- o- _7 {

DATE,decday = [],[]

+ K$ M) U+ t0 Q# S7 U3 X

for row in time:

! D; O2 x# h5 u: C7 b9 U

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

% F/ h# {; E j* `# p/ y

DATE.append(daterow)

+ `. Y$ v4 X2 H

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

' m! d$ T* w' Y* h

# First, design the Buterworth filter

# D4 ^, F# j2 Z

N = 2 # Filter order

5 S, P4 |$ i( f1 W+ l3 Z& k( q

Wn = 0.01 # Cutoff frequency

! e; Q, ^& V9 l$ J8 K

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

& v# V7 R6 T1 L4 _- e9 Y

# Second, apply the filter

$ c( f5 j7 T# h/ _& W/ m$ O$ M

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

+ d& K: N% U9 I* m

# Make plots

2 v. d2 r# W$ ]6 @, _

fig = plt.figure()

2 v. M# V; C/ {9 m2 `" a

ax1 = fig.add_subplot(211)

( A' I0 m" q4 @) T3 {- M. q$ z

plt.plot(decday,temp, b-)

* w. P* I! F/ X) v9 D; ^

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

& G% z7 G! Q1 s4 _- _

plt.ylabel("Temperature (oC)")

) U! p) X ^* h- W- i$ S9 K* \

plt.legend([Original,Filtered])

- t& J7 j: J9 h

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

* S1 d3 o# D! `6 u+ H

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

4 C- @7 Q4 u( @1 Z1 b# I

ax1 = fig.add_subplot(212)

3 E0 d( Y; ]& D- K# I

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

% y s F9 a* C2 ~

plt.ylabel("Temperature (oC)")

) ]# Z8 c y$ J$ {8 q/ n/ o

plt.xlabel("Date")

$ a% Y; y6 g: e9 H

plt.legend([Residuals])

& ? y2 D. J( ?/ R' `

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

: Z9 I I/ L' t) T. D! T

plt.show()

+ s. L% B- ~# F: w

7 Q9 h1 L e1 Y" |: A7 Y# U( _7 v

Example 4:三维地形(Python)

5 Z# w+ b3 I/ g( a) u( V+ ?" V

# This import registers the 3D projection

# u" b$ y8 }- j0 J

from mpl_toolkits.mplot3d import Axes3D

! S6 \) q6 l; |2 x7 a1 u

from matplotlib import cbook

8 C5 r- W3 r7 i6 N0 ?2 K4 ~( L

from matplotlib import cm

3 K- j; i7 g2 i1 I5 {

from matplotlib.colors import LightSource

`" V% r$ V/ k" \* h: M# u. T

import matplotlib.pyplot as plt

. C9 ~; g3 |+ N

import numpy as np

* w8 H2 o! Q( T7 S) G5 {6 q

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

3 A; x' H' h% T( l

with np.load(filename) as dem:

; K* N) Z% O3 [$ v9 r# t0 n

z = dem[elevation]

, h$ p8 N6 V1 r5 \6 \& c2 I

nrows, ncols = z.shape

T5 W4 C( X9 n T% s9 S

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

' [7 l! y& U7 O K; M

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

, {1 g, }+ z4 N/ A1 r7 D

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

& e N* y' C5 x$ e2 r3 i

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

; s+ y2 [8 a$ }( l* W: p

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

$ }+ y2 G! J( s, f

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

0 ~2 `3 s: L5 J

ls = LightSource(270, 45)

9 u4 Q+ @. c l0 d% _- |2 E

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

. e. u( K. g8 K

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

0 O" L0 S0 Z1 E* k M& W

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

; A& N- t' j, b* k# i4 P k8 Z7 g

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

% W2 }( L/ U0 V; |

plt.show()

+ q/ Y* E& N* |+ t d, K1 A ! b& i9 v' p5 m& y r/ h6 M1 H

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

2 F3 f3 g7 E* d' J: E$ p + j c R8 {% C8 A* M

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

; i* W/ G7 u( |: E4 [+ { # D. ]7 C' c- ]6 `& Z, P+ Y9 }& `

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

5 R: k% v1 o1 [2 i . p1 f3 e o& h1 s ~, _" T" U5 q

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

& s9 D* c! M& F+ F $ |5 ^5 D, c8 [9 i0 c) c6 w

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

, i; p$ ]* ~6 I0 _( \ B , T0 f q4 l9 Q" M2 b& t
% |: X, y; _8 h; ]" @4 ^( O% x
% @' ^4 o B j" P# Q# d
2 b: Q, q7 `# J. G+ O 8 g6 q4 v1 i& _8 j9 e5 P # m* `( V( A) K0 M0 d( j - }. b' ?# O% |+ V" K6 ^" w% q * ]: A: p3 s7 w* K) }# D- f9 ^+ }
回复

举报 使用道具

相关帖子

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