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

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

[复制链接]
% q2 A, U4 y% a: q. [- Z2 ~5 A
: `; B! E: | R. @
( n7 f0 e' ]! `/ z* r
5 l1 a5 R: m6 _4 r1 v4 ^

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

) N) O5 L, j# M

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

6 `3 N& S1 p: W k9 Q

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

% I* }9 X! F* w3 l/ T. \

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

" F1 r/ F i! l. @

import numpy as np

' m: [* b x9 Z) T* b8 G+ F8 @4 n* F

import matplotlib.pyplot as plt

! @4 Y% M& |4 N$ o$ b' a, X& u

# 创建随机数

; |, i$ }6 _2 |

n = 100000

. h/ y9 m8 _' k# [5 { j, Z7 F6 q

x = np.random.randn(n)

7 l$ I% W, Y# G) G, s/ }5 m6 R

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

* E$ O, g6 D& D

fig1 = plt.figure()

( ^) t# {- P0 C2 E8 x/ q6 }

plt.plot(x,y,.r)

0 J$ _/ e* q5 P Y {6 M2 M

plt.xlabel(x)

! n3 }6 @8 X5 U* v S( n

plt.ylabel(y)

5 y- [9 R3 ?- W5 @9 @; l

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

7 l" Z3 r; I5 h8 o0 ]6 C8 K) h

nbins = 200

, ]6 O# q3 t7 k7 Z8 j# q1 I- w

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

4 ^3 J2 @$ z5 @* X

# H needs to be rotated and flipped

6 I. Y& Z+ {* G9 Z* y! O: K( y1 t

H = np.rot90(H)

% f3 }2 \' @$ L& e+ x

H = np.flipud(H)

' R* c8 u# G/ }$ [% X

# 将zeros mask

1 O3 n/ W9 W; M2 r

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

. K! l) B1 o* \/ s+ _" k) h3 d; P

# Plot 2D histogram using pcolor

+ U7 I- X9 |3 A/ y. }

fig2 = plt.figure()

. h% W ^6 T. Q$ i

plt.pcolormesh(xedges,yedges,Hmasked)

+ j( K/ V+ E4 ]7 @

plt.xlabel(x)

- x* J9 c9 W2 ^3 S$ v( j* m; V

plt.ylabel(y)

3 o( n/ ?0 ?) {9 m. Z9 \) }, C

cbar = plt.colorbar()

" h( g$ M) e: Q

cbar.ax.set_ylabel(Counts)

, J5 V0 s3 b" y+ p8 G! m0 P$ b

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

* Y: q6 D) C; O+ c

plt.show()

" K# X0 @# @* z* r; N% ^# r
: ~9 W* J% X: @
1 V1 Q+ e" G; N
打开凤凰新闻,查看更多高清图片
" G( t8 c0 v2 d
/ d" d: B! |8 |& [7 S
6 s; ?- ~2 V. c* s$ G

1 x1 [3 M1 x) N% q, F' }& h% W

Example 2 :双Y轴(Python)

& b6 z5 ]( q7 O4 A

import csv

/ b: `4 `% }2 g0 r

import pandas as pd

" q8 g4 e' b# j1 }$ D

import matplotlib.pyplot as plt

: s9 W3 X# _ d( u' \& I

from datetime import datetime

4 g* w( D7 e; p0 v6 {0 e

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

6 b) v9 l0 }, J+ d

time=data[date [AST]]

& A. @* J7 t Z$ l+ Q4 Y# U1 X' |. B

sal=data[salinity]

9 _2 p# s+ S( V/ A4 e

tem=data[temperature [C]]

* ]0 Q! m: T/ o8 W* g

print(sal)

. o- b% j/ j% a4 X. f) v7 w

DAT = []

# i ]: @/ r3 {: y8 P

for row in time:

& [9 Q3 ^% o) {% k" |% S

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

7 b+ L5 k5 I! y# Y& y; Y ?1 c% G

#create figure

B9 d. M K; D7 ~/ V+ Y$ I8 X

fig, ax =plt.subplots(1)

- W n$ z% W$ o

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

3 T& P1 o. \2 x; v, g# N4 U6 A

plt.xlabel("Date [AST]")

3 K2 S8 R6 O5 `4 g* Q9 K3 n ?

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

: D; t9 f ^$ { i+ ^4 W

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

% l `3 c% Q1 x+ J: `6 y

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

9 A9 q' v _& f j& Y, ~6 U

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

1 {8 g4 r5 I* `+ r/ v

fig.autofmt_xdate(rotation=50)

5 ?" j7 {3 O0 r8 n% N% Y+ a8 r: v

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

* x' W5 Z$ P R7 T* k* _

plt.twinx()

5 {# z9 | f1 c" U2 h

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

* m) [# p- M/ u4 o; l! k

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

% V! D2 a. d7 r' m/ T

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

. h7 h+ X$ I) ^* U. M k4 d

#To save your graph

- t. l7 o. d2 \3 c

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

' n& n' `% @2 x2 Y/ R

plt.show()

* G5 R# r! o. k; @! s$ L. k: B

9 c3 G0 b8 C: } ~7 C8 u

Example 3:拟合曲线(Python)

# J; O: c& K) o* |( i- n3 d

import csv

) A2 F. ~1 O2 I; ?- f4 ]

import numpy as np

5 F6 o' v3 J& G- F

import pandas as pd

$ `/ r8 {9 M: c" R7 i: D5 i2 b/ U

from datetime import datetime

3 T- c: T" [' G/ b, }" ?

import matplotlib.pyplot as plt

4 \5 J% c2 x- W( Q- S/ T. W

import scipy.signal as signal

4 g, e. q) H( y% u

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

7 W' U3 t) X9 ?/ d5 ?. ^: e

time=data[date [AST]]

) W( A8 F* T* g8 E# z5 T* w+ p

temp=data[temperature [C]]

$ n6 }7 ?' J6 I

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

9 V3 E: _% }* t9 u" p$ [

DATE,decday = [],[]

. d* n7 ?- w1 ]. C6 j8 Z3 F! }* Q/ S! f9 ?

for row in time:

/ q9 N* o3 ^3 B. a

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

* q) U) v; n2 M) ~7 ]" Y" [

DATE.append(daterow)

( l# N. [5 ]$ ]- H0 o

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

# O% y, e2 j. j0 L2 r- `1 X5 S

# First, design the Buterworth filter

0 C, f- M* d& H L

N = 2 # Filter order

6 J6 o% h1 ^/ d

Wn = 0.01 # Cutoff frequency

1 {: ^5 i, T6 h k

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

+ I6 \. k1 z3 T% H' C

# Second, apply the filter

2 o6 C* ^* G5 e9 A( d1 h1 P& e

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

" b# K0 R5 \. u1 c6 [ I( g- \

# Make plots

, A0 d9 V" } I1 S

fig = plt.figure()

3 J: K. ]2 |6 }' }( i2 l; @' f) N

ax1 = fig.add_subplot(211)

6 ]& K1 w" U, i5 P8 W/ ^

plt.plot(decday,temp, b-)

5 ?! q& X9 [$ ?' m

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

3 p6 f( w2 V5 N! T) Y g% C$ W& f

plt.ylabel("Temperature (oC)")

& G2 U: Z; }% H5 f" {) }+ s. l

plt.legend([Original,Filtered])

; ]( p, p. z/ r0 y, @

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

* P+ x' W( y+ E2 ]

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

, q) f9 o/ \6 x" G; h

ax1 = fig.add_subplot(212)

! k4 N# r# ?; L6 r

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

! z% I$ A# C9 }. C/ |, U

plt.ylabel("Temperature (oC)")

9 r2 t% e: D- o& A5 W# S

plt.xlabel("Date")

7 C5 r+ \9 c a C, g# m

plt.legend([Residuals])

; m5 M4 t+ Q3 q7 Q6 {7 L3 V" X

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

) _3 S9 ]% n$ {. a. }

plt.show()

* W3 T+ y& i" \0 J1 B

& M! e, p5 p$ W

Example 4:三维地形(Python)

0 G* c* C; v0 @

# This import registers the 3D projection

7 H2 _: ]9 J! C% ^5 k% @5 I5 }) u

from mpl_toolkits.mplot3d import Axes3D

% g' j0 ^4 i9 P; m9 K8 ^

from matplotlib import cbook

, d+ T: |8 a# Z: }% B6 a- g) `

from matplotlib import cm

6 @0 W. C' X% e& e% V7 T2 _' {

from matplotlib.colors import LightSource

- z, g) g1 O$ c

import matplotlib.pyplot as plt

! ^, Y* z( M* K! b W

import numpy as np

5 ?* y. c1 d& G: e: {, X8 d

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

2 R+ i- C% F, H3 K0 I4 e+ H3 F9 u; @" A

with np.load(filename) as dem:

2 ]1 Q( S) \. I8 g3 m

z = dem[elevation]

4 d8 ~2 X2 ^7 D+ a: Y

nrows, ncols = z.shape

U9 \) h2 Y+ ~3 s r7 ^

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

; l H6 @" V6 C

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

. R6 @% Q% `/ L" E/ q4 d4 P# Y

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

- ^3 Q8 C; M% R" k

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

( {' K# X B+ e* x+ U

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

: X3 _' v' p% i9 q$ H% [

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

8 S! T( X5 J Q& U) K

ls = LightSource(270, 45)

0 r% I5 T8 {( x4 ^+ C7 ]# H

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

* Z# M$ a" t* {4 T/ g

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

8 a- O! K, b# N/ e1 f

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

( R) Z& Q1 M$ N% D( Q* G5 A

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

# ?1 K+ G: @. U# Y0 K+ b

plt.show()

# }$ B& [1 B0 t, J' n( N. [' X 4 w6 ?) O q" b. N0 h

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

1 H6 z2 a6 v X: v 6 p' Q! I' F( U/ v$ _

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

" d3 a& e6 G' c' G5 ^5 ?. K ' L' i$ g1 C' P9 W4 A* v/ m9 n

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

7 Z* M# U' s: s- Q5 T, y0 a / b( g$ S6 _9 G% j' e9 K2 _, A# t$ m

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

u! t. a$ ? T( I & G! N; @) t# {3 E

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

& s1 B- x% \- w+ s6 |, @ 3 N$ Y- P% u f: X+ S1 v4 @! z
5 x7 K- z c5 `) X
; |( i5 ?+ l; C' T: l% E
2 f0 b" J/ H9 J5 { O - z4 o+ b# \* ^! K: }0 M. {* w2 F/ w# L6 V 9 |* F: ?: f- k $ f7 B: y" n6 L! W7 i5 U
回复

举报 使用道具

相关帖子

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