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

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

[复制链接]
) @3 _; G% b: @& r; D! W4 n v8 \% D
- t% Y& P) E; U) J& Z
0 D1 ?8 t& q/ n5 {
1 ]8 u1 n! j% X9 _; c- M' ~

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

y' S7 n4 _5 m) u+ Y3 x4 W

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

$ h5 L3 y* K8 }4 Q0 L; C

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

& J' O5 C7 g4 d5 M8 n0 `- Z9 C

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

+ N5 Y4 C# E# W8 i

import numpy as np

& J) L6 k3 M m/ J9 z

import matplotlib.pyplot as plt

5 D z% m3 Q! ~) B1 T/ B. u

# 创建随机数

$ l6 K% A7 ]$ o% m/ Q0 @% L, X/ H

n = 100000

/ r6 I* W; I+ z- a5 B. J! d$ |1 a+ `

x = np.random.randn(n)

# F, b. u( G; N* t% m( a, T. l

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

) p! ^7 F) X" ]$ K, V; r( l

fig1 = plt.figure()

; y3 }) ]$ |% ~3 c% w% u9 v( h

plt.plot(x,y,.r)

! G0 o* ^- o. g9 M: K. p! H

plt.xlabel(x)

0 z2 ?3 r. O/ P- `7 u L- r

plt.ylabel(y)

& X2 H' I+ [$ P5 E$ m9 i

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

a4 o; n! Q* q0 d7 |

nbins = 200

1 E9 M3 z6 E( ] u! }2 x3 U

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

?( M/ M J) I1 r9 F, i

# H needs to be rotated and flipped

" e) @- u! A4 j# w0 ^2 i; x n

H = np.rot90(H)

+ ^2 F" q4 U Y9 |4 o0 z

H = np.flipud(H)

' B/ z) Z0 D( c6 r) ]

# 将zeros mask

1 I* v) y, K* ]8 k/ ~$ r

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

: r* b! T- Y4 m

# Plot 2D histogram using pcolor

5 N; G" e3 z2 G9 I

fig2 = plt.figure()

% s4 `: [ Z, M

plt.pcolormesh(xedges,yedges,Hmasked)

: A0 v8 B( r/ H7 w5 \. T9 h

plt.xlabel(x)

5 v' x! l1 ^6 ]5 D6 F

plt.ylabel(y)

# V3 F' p) _; V. v* S7 U

cbar = plt.colorbar()

+ a9 u1 e6 z/ y# ]

cbar.ax.set_ylabel(Counts)

* J1 k9 Z9 C# I+ c: |3 Q

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

4 x4 U( I/ p* o3 J, L$ k* X

plt.show()

/ X O0 b0 Y4 v* g' l5 j
1 G2 d9 h: O! |- m) I
! u5 C5 m+ U# n9 x5 {
打开凤凰新闻,查看更多高清图片
9 M, [- I2 Y, F# H2 P9 K- q2 m
+ A7 t/ U! n" [4 Y3 H$ P& F- y
2 K# s* C" i) [0 }; p! ^. M( H

& I6 Q1 M2 U8 H Z

Example 2 :双Y轴(Python)

X# N6 J. n( I( X5 j2 l6 s; g

import csv

: K) ?) Y% {4 E& s9 k1 F! m+ o

import pandas as pd

2 V1 H* P: l" H! D7 O2 _0 _

import matplotlib.pyplot as plt

l7 L6 i. Q* s8 X3 Q) U1 u

from datetime import datetime

" j# p, K4 l3 Z5 p8 z o7 r/ J

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

, k' e+ B) R5 R5 g0 v3 c2 @

time=data[date [AST]]

, a' \) M2 Q/ e1 F" K

sal=data[salinity]

! Z; I1 T/ g* D5 x) J

tem=data[temperature [C]]

: _! W' ^7 g2 L& g/ _% W

print(sal)

2 e- N7 j- `* F& i( j0 E: U

DAT = []

3 y6 S/ e/ I4 Q8 M: ~" f

for row in time:

0 v7 g# P9 d; T; s

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

; k! m& k3 h5 n$ ~

#create figure

' \8 A0 {5 ^' H2 p

fig, ax =plt.subplots(1)

) X% u) d! C0 s" X$ V7 G8 s( m+ u

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

8 p# N0 i# u$ T8 z1 X. r

plt.xlabel("Date [AST]")

_# T8 e; w/ v% N3 K

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

+ W+ M2 K3 c" W3 B

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

! i6 I( D6 }& v# O& ~2 b

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

H# O" Z1 j( f9 c% m9 p; o

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

6 P7 z1 p3 U- V3 t

fig.autofmt_xdate(rotation=50)

0 u9 z3 z2 ^! u1 f2 \

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

/ p4 k: {) z9 w2 s

plt.twinx()

7 z, |2 J: d7 J2 r2 p5 }# J, B( H

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

6 m. a( b/ q+ Z

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

/ q `. r" u# W! } b3 \

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

# |. Q. r; P: x) A! Z

#To save your graph

2 N! i+ ]- G+ w

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

; {( \, l( _/ ^# \# V

plt.show()

9 @. K/ s8 y- {8 J* u) z$ W! H6 l/ S

, p D2 N8 k3 v; Q* H& K. m

Example 3:拟合曲线(Python)

+ y3 a" n0 @' G

import csv

4 f& F- O# ~/ a

import numpy as np

^1 U9 y% q& ?

import pandas as pd

4 H! t$ k/ p% V8 w2 m

from datetime import datetime

0 K. g5 E" { K# f- W1 O

import matplotlib.pyplot as plt

' T& m/ d9 N/ d4 S2 h( j: i

import scipy.signal as signal

: {- R4 m z/ A8 B( R, U: U9 M

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

3 M" R% G, ~5 m3 @* `; V9 q

time=data[date [AST]]

) p$ N) ^8 A0 t, O

temp=data[temperature [C]]

* `! p& |' @4 p+ J; d

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

. N3 C* E" H& @

DATE,decday = [],[]

: H' Q- @4 p. l. @8 \ f

for row in time:

/ d8 _8 s! l; \+ n6 E# M& Y# f/ r

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

9 O0 B9 z% Q, y9 i) k% [5 D

DATE.append(daterow)

" q3 q2 z+ ?( B* v% ^

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

; |* N5 e5 ~: b1 {3 \) B& |1 i

# First, design the Buterworth filter

( ]8 g3 y; P9 m; P: k$ M- f& Q

N = 2 # Filter order

- a! i, y( b% T9 n& `1 ?% S

Wn = 0.01 # Cutoff frequency

7 g6 O5 \3 v7 S7 K% [

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

2 D) S7 p+ s- ]

# Second, apply the filter

7 K$ n }7 X$ X# W4 U0 _0 C% m$ t

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

! b$ D& N& e) n& Y

# Make plots

" \6 W) r+ N+ K8 L0 h

fig = plt.figure()

, H# Q. F( J- F

ax1 = fig.add_subplot(211)

7 \% I# v7 q) i3 w! s

plt.plot(decday,temp, b-)

4 M8 Q8 Z5 X. [8 T0 B! j

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

. S0 I2 V0 |+ n4 ^( e

plt.ylabel("Temperature (oC)")

& G/ q5 z5 \7 k2 K+ t# @- h

plt.legend([Original,Filtered])

7 G9 a" r. d6 ~. Y) E' g! S5 ~

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

; A% L0 J* k- W' a

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

5 [/ j! p+ x# K3 V4 W, W

ax1 = fig.add_subplot(212)

6 F# z1 j. _" _$ a5 F/ J

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

$ y4 L2 C5 j T1 v! k

plt.ylabel("Temperature (oC)")

6 m% O1 _4 ^" D# t z

plt.xlabel("Date")

, |2 J' F* D4 q' v

plt.legend([Residuals])

, s( V; `& \6 A: A- o; P

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

/ `2 x% Q- l. `. Q9 B( c: y; s6 T

plt.show()

6 T$ G7 m; |, G G! E# V

8 H' H# T+ i, \; ?0 A7 C6 \+ s* k

Example 4:三维地形(Python)

. v4 a! n! `/ U+ x3 C4 I |

# This import registers the 3D projection

% U, h: h, [" F( {7 j

from mpl_toolkits.mplot3d import Axes3D

. W U' S6 y5 A+ s9 x

from matplotlib import cbook

. {, r j# ?& Y; J) Y" H6 X. Z

from matplotlib import cm

& }' v2 z0 J. m* q# s

from matplotlib.colors import LightSource

7 ?& b! w" I/ A0 G% u

import matplotlib.pyplot as plt

. d- D9 S' P/ l

import numpy as np

4 Z) m, E3 G0 x0 g

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

1 {) x$ k' _! E( I @

with np.load(filename) as dem:

( j0 p) Y5 z8 q! P" k/ M' S

z = dem[elevation]

% G" L( j% s3 z% P! C

nrows, ncols = z.shape

8 r H; S2 J- F( ] P" V

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

8 \6 [# ]0 e+ p9 ^: C* K5 |' U

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

" x h& l# D0 f* @6 d: g

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

( G: d. Z8 c* v: F

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

/ W5 P9 L. @" H- ^; e, X0 h8 S

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

$ k5 h+ v- z3 r. D. n) f% x

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

% x/ U/ R5 `2 w" |* j

ls = LightSource(270, 45)

% X# N0 o' y- F# X7 O

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

% o* l$ U6 j! C8 F* ]7 i( s* k e

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

' s8 g. t5 t6 a, I/ }# x

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

^( B+ }. k9 P$ c; o1 o; h- h0 }

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

; `+ z2 F7 a% z8 X

plt.show()

/ O! h e- i: R + l# L8 g$ ]2 u1 M4 p

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

# C5 @0 [' }# ? / {9 \6 m, a8 }

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

9 ^3 v& i5 R2 w2 x9 D' h+ n . a# U' V7 R( U8 @. M% C* i

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

% l' o" c8 A$ `( y 6 b8 d2 M- C7 W& b2 ~3 i

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

9 Q+ t# e; Q2 ?$ }6 {8 p/ x # D/ n5 H ^! K

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

+ n, t% I- X$ L% X2 C& [ 0 W$ Q }4 d: d" G- i% I4 T
& E3 t9 T6 X' e- E+ z
, g$ D$ |8 e1 L. A9 w
6 U3 E& V2 o2 K* G8 E 9 _% q. x+ I- t y" h2 ` . ^) S! P+ \( E5 K/ r2 t5 d & {4 Y) Q6 x- ^% p1 H; D 3 `- d2 C7 u+ c# C
回复

举报 使用道具

相关帖子

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