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

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

[复制链接]
) p" v" c( o+ _; u" Z
2 y: m. T' p9 Z8 K/ h6 L; S
) R0 V i- r: r/ T9 f
; u) c$ ]. e2 Q, n4 Z3 D

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

6 ^, j5 C1 X3 `9 g k* d* {+ M

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

, r9 d$ j$ e0 Q0 z3 g! s; c

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

5 |" P' G& [. Y/ K" P0 j

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

; B) [# h S3 c% y

import numpy as np

8 R# F7 U; ^; P8 A5 h% u

import matplotlib.pyplot as plt

3 j( k( T- _% y. t/ m I

# 创建随机数

2 _2 Q% y J; v" N

n = 100000

5 C S1 w. B5 K2 ^( J8 c

x = np.random.randn(n)

' h+ B# @! p8 M

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

/ d/ e& j1 E$ X! Z! }1 s

fig1 = plt.figure()

5 J& x$ p* v0 d3 x6 S/ N3 I1 x

plt.plot(x,y,.r)

: ]& y+ ~3 _- Z' @. o- G

plt.xlabel(x)

0 C, S/ X, n4 u* [: B. [

plt.ylabel(y)

+ |- L! `' n% ~: A; {+ l9 h. l

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

7 Q5 ~! a! L2 e& q i+ p% b

nbins = 200

9 l' a- [# Z! }! v( G- D

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

& o1 w2 ~; {2 l* z

# H needs to be rotated and flipped

; o3 l& g8 ~4 u/ H8 X

H = np.rot90(H)

1 K% l9 u4 V u" F

H = np.flipud(H)

# o' h3 M: f/ m) d& T

# 将zeros mask

& g9 \4 k- m3 v* c6 a$ l; j) `+ j

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

3 y& \: R. z6 L# j7 Z5 L4 [* y

# Plot 2D histogram using pcolor

$ X I9 E3 F9 b0 F# { r# h4 F

fig2 = plt.figure()

* q: d9 m; R2 q+ w' ^7 Y4 |

plt.pcolormesh(xedges,yedges,Hmasked)

' B* s7 g, _2 p, j- _

plt.xlabel(x)

/ p. [3 o- F3 Y N% I( Z8 X

plt.ylabel(y)

" U& v* O1 U1 l4 Z* _& Q! P6 F$ }

cbar = plt.colorbar()

% ?/ M( Y' D4 X

cbar.ax.set_ylabel(Counts)

% @' k, O; P9 ^

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

/ q# N/ G5 H% e) e$ o

plt.show()

! L( d5 X J- m# m" x- N1 |0 L9 z+ L
" L u6 o6 t: f# s5 B- x. ^% ] L
3 v5 z- W% M/ u2 o) J- M
打开凤凰新闻,查看更多高清图片
: l* A7 r+ e$ p, x @
* T9 K' m/ i: W$ n2 Z
+ Z' o6 B) i3 F$ f

7 Y- g! i' J% h* P& B

Example 2 :双Y轴(Python)

# N. J; m J: T& D

import csv

8 i+ G F/ x5 n

import pandas as pd

0 {" E7 B h$ S/ u

import matplotlib.pyplot as plt

: z' K& k0 W4 j9 d

from datetime import datetime

4 n- c% ], [" M: L8 c3 ?. ?

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

4 s/ x6 D _9 S& i1 w) ]6 {4 ]

time=data[date [AST]]

/ N/ j: O- `2 T9 l( }$ R7 R4 D

sal=data[salinity]

# p, C7 t" z# c

tem=data[temperature [C]]

$ s8 J7 ?2 ]3 `* u6 a

print(sal)

1 [. B# G ]0 B1 G9 L; Q

DAT = []

" _/ ~; {: u" G: a4 r1 O# a

for row in time:

0 z# a( w0 o- o: a

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

, [0 u2 O4 k: `' s; C+ x# J8 P7 _

#create figure

( D1 ?. K7 `: Y3 S

fig, ax =plt.subplots(1)

; Z/ a7 S. X# R- c' B p9 j4 |$ i

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

) F6 H5 f M7 v5 n

plt.xlabel("Date [AST]")

- I" \; H9 ]; I0 B7 u+ o8 H: T

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

1 A1 ^! Y. C! j7 c) b* i5 q: s

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

" {3 ?" M1 X2 D# @" j

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

: h4 `* _( M2 Y5 n# b2 U. y

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

; r; l* P% S4 e

fig.autofmt_xdate(rotation=50)

2 D/ A" G- e5 B2 ]

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

0 K* C0 |8 c7 W! q$ v4 j

plt.twinx()

. @: }+ x5 ?3 W( i* @, ]$ t) b

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

3 z) s2 J' ^9 p+ G# Z! z5 L

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

! ~ T' l! H2 [' j: e% z3 t4 q/ [+ j

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

9 q' v6 `( U1 N* B! O2 F

#To save your graph

7 A& g* `$ b3 T& D" m* a

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

% G/ n6 ]& ]- C* N* F. U

plt.show()

" s: D+ Z7 L; [3 j- @ G

( O0 }/ x' S4 Z# B6 z

Example 3:拟合曲线(Python)

! }' J. K4 l) x6 f2 D" U* P' N' r# U8 z

import csv

9 `# o+ X: q! j1 Z. @' f0 _6 b

import numpy as np

- Q6 t. a& A% ?

import pandas as pd

1 _ j& S3 L. K" ^! {

from datetime import datetime

/ o) v( @# g p4 k4 O

import matplotlib.pyplot as plt

' J' t* D. d2 L+ h- ]2 J1 a

import scipy.signal as signal

8 {: s$ C) g# l! Y4 V

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

% v# l$ F+ ]* u9 s' I, b; ~% M

time=data[date [AST]]

& v( Y4 p& o9 z: D9 O! n& T3 b

temp=data[temperature [C]]

0 D& p0 a3 _, c! B+ j3 f5 w1 i

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

! E+ @# ^) ^: K$ o

DATE,decday = [],[]

# ? N1 i# H$ R7 C2 c# B

for row in time:

9 L$ t6 I9 o% Z! M3 M

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

. N8 U+ I$ Z6 f' s; W

DATE.append(daterow)

7 } @; v5 r* \0 Z

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

- `8 A( j( L) j' \- [0 L

# First, design the Buterworth filter

7 r) o+ |* f$ {1 T- S# _! T

N = 2 # Filter order

: C, e- g. E; S! P# @( K

Wn = 0.01 # Cutoff frequency

# n* T; R6 @. I0 i- K

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

9 q/ d! b( J# h _

# Second, apply the filter

0 b( R& C2 J: W' }9 N4 K3 V

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

' p/ [' W1 z2 z$ j* p, k

# Make plots

1 x) q$ O% q+ ?2 ~

fig = plt.figure()

% R% C( N4 F$ g+ }

ax1 = fig.add_subplot(211)

7 f7 z0 M& X" R, b6 K) E+ l

plt.plot(decday,temp, b-)

% p- y* g% l0 g7 _

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

c8 |8 o% L6 Y( H" l) h

plt.ylabel("Temperature (oC)")

# M( `" o8 g+ \) K$ U

plt.legend([Original,Filtered])

7 E2 X; S' r1 @; \

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

1 m0 P! h/ f' f* w5 {

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

8 E! A, v) p$ n6 q/ C2 [+ |: s

ax1 = fig.add_subplot(212)

) P9 y: E: J3 P9 ~$ _

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

- h% d# r5 r8 A$ F5 o

plt.ylabel("Temperature (oC)")

& l t( f- u2 X+ ^# i* R

plt.xlabel("Date")

) z4 Y4 ?6 |2 H4 ~% ~/ y

plt.legend([Residuals])

, W. p- g& r9 h) [! t

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

% l3 e& G6 P) j( e% k% u3 U

plt.show()

. u0 E6 }! z- `9 p9 E

; D- f, e7 n9 o$ J2 ~1 C B( K

Example 4:三维地形(Python)

( X. @( D1 U8 @

# This import registers the 3D projection

/ y# G. x7 w* Y$ L3 V, g

from mpl_toolkits.mplot3d import Axes3D

a% H: g% A; j& N8 o! R) ~

from matplotlib import cbook

3 h- `" g% I6 ` V

from matplotlib import cm

1 R, U% Y9 W' ~6 \- U# E D+ i

from matplotlib.colors import LightSource

" Y2 ?0 k7 G( P& H8 p+ ]

import matplotlib.pyplot as plt

. D/ X; R2 _( @# Z& r

import numpy as np

$ b* V1 E. z+ U! y+ N

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

# l+ w! G$ ~$ g& W

with np.load(filename) as dem:

' j6 S( A! p- v7 a& y8 s: x# A' F5 |

z = dem[elevation]

6 ]8 p/ o7 N9 |2 \

nrows, ncols = z.shape

/ Q% I; j- g- b; a* z

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

; N0 f: ^- z) t( L! d

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

' h$ B! c4 k( G1 s

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

6 r8 | l7 ]" |, Q6 L, R

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

$ |9 d4 P- u0 }; a. T

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

4 T% o+ ^4 Y, h

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

# H: W$ q, e7 b. K3 l" H

ls = LightSource(270, 45)

; r) G! f3 v) j$ ^- n

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

E0 }6 }1 I r2 R5 b1 ]& g! H5 X

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

7 K# v& l/ A) g0 q* s

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

- F9 D2 a5 x# J' G6 p, |

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

- q; e% A! q( @% y

plt.show()

: w W7 w- m9 A+ z/ c 1 l- B) w3 u9 G2 T' G

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

% I$ k/ N- D0 i$ g 7 k' O- `) _$ B* D+ n2 W! I+ i1 T$ p

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

; C9 w" y3 L+ m0 j 8 N2 z) K6 O ?

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

/ ?6 h$ a9 Z. g$ n% X( w, G( w 4 K* O- I" M9 t S* T! f. t

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

- `1 c4 m; M- B# M5 Z# U; q# V 1 M L Z$ `8 B4 M, N# R

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

' E! K& _+ W4 c( T7 S # ]; u0 ]/ j; X
7 {/ H, N# K0 Y7 f
$ T' D1 s' R5 V* A/ b8 o
3 S7 w B. p' f/ B" Y. N , D7 n7 ?1 B* `% ]1 o, ]% I9 W+ U3 p8 X( l, }& H# X/ ? 8 |) t0 N. ^7 n4 k8 K 1 s2 R# `1 z Y! |
回复

举报 使用道具

相关帖子

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