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

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

[复制链接]
5 R: T$ o6 ]; | p$ { R8 D
" S) C6 s/ J( A* a0 y: X
( g/ G* I6 S* j: Q
0 O$ j- h# J- l) G( w

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

# M- S+ X/ b0 F, F9 s2 z3 l

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

% M* N1 w: K7 L! }( j

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

2 r0 P7 J) T" D& p+ _& M O* j

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

+ N0 x1 F5 Q9 L Z" F

import numpy as np

9 x2 z. {3 {. N; w

import matplotlib.pyplot as plt

6 S1 U4 R9 G9 v& t$ k2 T; q

# 创建随机数

& k( }" Q; O# \' \9 v2 M5 H0 Y1 j

n = 100000

. N( D& Y2 x9 S( t1 E8 @

x = np.random.randn(n)

8 A. I; ^( M K. A' ?( T' A3 @

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

9 }' ~% v# N* }0 e; q

fig1 = plt.figure()

' _0 d+ r8 T! S4 N5 }. p T$ `

plt.plot(x,y,.r)

) o( ?7 Q0 a. d1 l6 ^" b

plt.xlabel(x)

5 A, t5 C4 V, H, f4 m

plt.ylabel(y)

; c3 [0 O5 T5 [$ Q+ y

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

6 S9 P' J, u- f. r! U& v9 d) B" M( |

nbins = 200

* S9 S- q& S* |9 o- @1 O" T

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

; p. s+ V/ U/ z+ s) ?% m( n3 D

# H needs to be rotated and flipped

$ R% s; A* Z: v

H = np.rot90(H)

( ^+ p# e: t4 G" m

H = np.flipud(H)

6 W# S1 S7 e; y- ^8 w0 Q: X

# 将zeros mask

7 b5 h! Y6 D6 s$ p

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

# `- a7 V) S8 }7 ` n1 T Z! x

# Plot 2D histogram using pcolor

" i8 f$ C/ P/ j, _" t9 K# ?

fig2 = plt.figure()

. ]& R5 t" F; F0 _5 T

plt.pcolormesh(xedges,yedges,Hmasked)

6 ^" h7 Q1 E6 w% i6 f! Y4 @

plt.xlabel(x)

6 _! E& F# \; m9 H( C2 |1 D' m+ d

plt.ylabel(y)

# R- A! P: C' U$ _

cbar = plt.colorbar()

1 L4 I" }/ _1 u( M4 U0 W, H

cbar.ax.set_ylabel(Counts)

3 ~, E5 s' t- ?

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

0 T. X5 m ?2 {1 G# p

plt.show()

# P; g- M! V6 C0 B: R, K
% u D a; s) g/ t# p' E" E1 U
6 B6 h6 v ]. l: T2 q
打开凤凰新闻,查看更多高清图片
% g4 B- m% F W w
+ T4 l; D3 C* Q. E0 @; F; d$ k l1 N
7 R5 Z& o* k. c3 k! i% j# f/ o

+ n0 c8 W$ O9 [, B# z' n v0 O

Example 2 :双Y轴(Python)

6 A8 ], D2 y7 u, ]/ X1 g4 E

import csv

1 [* c) K: y5 T, M& q) f

import pandas as pd

1 Z. D9 K1 j: U7 x

import matplotlib.pyplot as plt

; p" ?! P7 H! V4 w4 Z) ^

from datetime import datetime

3 w H0 `6 P6 g4 c0 V7 w0 I

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

; h, M, x) n `6 U

time=data[date [AST]]

; t, V. r* j# L. ]: g

sal=data[salinity]

2 @- L& [/ @8 a! |1 Z

tem=data[temperature [C]]

6 q7 r: c! y0 m

print(sal)

e3 I0 X, e* I: z

DAT = []

6 e+ }5 s6 j( K% S# j/ e

for row in time:

* ~( `/ j0 y y0 {

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

& R1 e Q6 }+ n, b6 q# r

#create figure

2 r7 O7 k, E# h; T* l. x

fig, ax =plt.subplots(1)

+ y) b% O& e' f( o* _

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

/ M5 b, {3 X* K& w

plt.xlabel("Date [AST]")

# b1 `; i9 e) V4 y

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

- f. m# a: W* b9 s4 m; K' w5 D

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

' @7 n" y9 M& q, Z' U1 n5 B

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

# t9 h4 C8 Q/ B( Z9 P7 X$ b: b

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

9 M+ z! R2 |. Q5 ^' J

fig.autofmt_xdate(rotation=50)

* n. u* i8 U, `

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

% o- ^; S# J; H7 i' v6 s/ R

plt.twinx()

$ \ y0 ~" u B# b" h4 l

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

5 d7 r8 C: }' A4 _" s7 r

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

& F9 {4 _. T5 p

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

- F! p) C, ^" q) n% L

#To save your graph

/ u" [6 k5 i1 s

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

" M7 s* V- u/ E. C+ O

plt.show()

6 a* i: B! n" b, p7 Y" i

9 I, b0 s% G% }/ M2 q

Example 3:拟合曲线(Python)

' [/ F; Q$ y4 D: v. Z/ u* ~6 L

import csv

( A7 Q3 K+ U" n7 z

import numpy as np

9 U4 b$ H! I2 M

import pandas as pd

% W; y% x1 |. G' t- I

from datetime import datetime

5 Y+ k- a3 w! x/ R7 r; c

import matplotlib.pyplot as plt

( X# M. u; I7 }/ x

import scipy.signal as signal

9 [( w1 \- k& g; t

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

w( ?/ I9 r+ w$ |

time=data[date [AST]]

( ]2 A( a3 e: F2 j

temp=data[temperature [C]]

3 ~% P: Y3 C+ Y+ x* t3 p6 y

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

( u, w2 O" y$ l% C& v& ?# R

DATE,decday = [],[]

/ q6 W0 K* I% G) @

for row in time:

+ i/ a8 Z) I d

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

% _) s0 n( F9 y( Y" G

DATE.append(daterow)

4 r. \- H/ j7 X9 V# r

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

: a) L" i. Z* G. o

# First, design the Buterworth filter

X2 g* ]# t/ d% O. s

N = 2 # Filter order

4 ], c+ M. e8 _% ?( ?6 H4 i1 r0 y

Wn = 0.01 # Cutoff frequency

6 B/ c7 H" c; ]

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

0 j/ U6 B, r% z4 ?) Y! p( R

# Second, apply the filter

z8 L0 L3 e% Q, `- Q# F6 [% F

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

' \8 v2 S; e6 p/ r0 E

# Make plots

* c$ i0 Z% Y) J: I5 c$ e

fig = plt.figure()

6 X" s) c/ t( r, h- K, O2 Y" N

ax1 = fig.add_subplot(211)

# I; i: O$ n2 \7 O5 X1 R( V) r

plt.plot(decday,temp, b-)

$ J7 c# l: O+ |+ h2 Y' U9 U

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

, Q) | ~( B; U

plt.ylabel("Temperature (oC)")

4 q1 Y$ |$ K) u% s" I8 v

plt.legend([Original,Filtered])

1 d0 w7 Q9 @1 \

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

/ o% i2 D9 P5 j/ u" U

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

" P* p0 ^1 u0 P4 E+ ?

ax1 = fig.add_subplot(212)

N+ r4 \ E) e

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

1 T L( U) @7 d

plt.ylabel("Temperature (oC)")

2 h& \9 T% u+ ?

plt.xlabel("Date")

5 o5 T) ?& K6 T2 p- G

plt.legend([Residuals])

4 E- f# ^& W: n9 J- b. W

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

; \8 D9 \" V2 ]$ r _+ A0 `

plt.show()

, l) Q9 V" m z2 w" O4 _- {

" ?) @' e6 T) q4 ?

Example 4:三维地形(Python)

" i5 u* N4 \% x: Y8 O; E: h: A

# This import registers the 3D projection

/ \& _" |. A7 m' x( W3 u+ Z2 H

from mpl_toolkits.mplot3d import Axes3D

) q, [- Y7 s& n* [

from matplotlib import cbook

4 J( H% J3 x0 A# M' i# Y/ P% W( ]

from matplotlib import cm

( I2 N3 C( b* W6 y' z/ V" w

from matplotlib.colors import LightSource

% m# B$ d1 E2 V& m

import matplotlib.pyplot as plt

0 d7 \! Q( t9 u1 t: V

import numpy as np

3 m( R, M9 S/ L* Z* \

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

; s$ p: s# v7 r9 {- g

with np.load(filename) as dem:

/ k+ I+ s m0 |

z = dem[elevation]

% S/ }$ I+ l' _% e) J* `* j

nrows, ncols = z.shape

/ I! M B, `. p2 { d

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

" N1 B3 g' c6 S$ C2 T* A

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

5 n) C* p+ l+ ]9 k2 h

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

3 J6 Z. ?0 E/ m5 m' x4 u' f& l

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

5 T- B9 i9 X$ O' D) F: _7 _

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

) Y3 _, d1 @5 A+ V

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

7 ]# P8 B! _! }, T9 \& I

ls = LightSource(270, 45)

9 `1 \( Y* }1 C# O: {" _2 P

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

* j0 t+ ?$ g H' O9 ?% I% Y

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

! c$ {- ]4 Y: R* O

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

' }$ o% ?( Y6 p% o( L

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

$ M3 h% B, P% Y7 n1 o

plt.show()

' E h, f) j6 y5 w& ^4 P& }- n " B1 G8 {6 F8 H- |) Y' M/ C, U

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

6 s, Y4 g9 n$ h3 w4 Z4 y; g- f O * r% y0 `; H, w. d% P# x+ F! H! `

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

% X# E0 K( a( `% [. W + {0 n* k2 G b

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

( n( ?; d- |1 b, A# t/ o$ e + E0 z. V" v9 z/ a0 V, ~; Z; U4 d2 S

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

* q: e6 i! F- P2 R) z& s 6 Y9 ], I1 l& g8 \5 [

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

% ?$ Q/ ?; {! Y1 k4 I4 K 7 I/ }6 C; \6 n: K. x
+ ?) ]: o {- P% H O& H' {
H' B5 w5 J6 b
9 b# O/ I% b; l ^" R 8 T0 Q# M, e/ q , k# ~$ k0 b4 |- @ 8 Q3 L( W1 h/ G; Z! [& H; N+ m # P1 ?' q- c+ `1 c2 Q. Z3 N
回复

举报 使用道具

相关帖子

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