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

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

[复制链接]
3 v! L4 T( G; G3 |/ z) s3 K
) q) D1 I& H6 O# J7 z c; b. z6 j X
( N& n4 s% e+ R2 U @
& Z1 W% \ D' L- f

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

: Z) g( O* R# c8 c5 k

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

N# W4 M6 j. h: \' p0 m: U* a

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

/ `5 \/ H$ E6 O

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

D" R& R8 |! m

import numpy as np

* m* Z; E0 t$ {5 Z

import matplotlib.pyplot as plt

8 g% }4 p! {2 y

# 创建随机数

# O8 _3 L( e% ^$ O

n = 100000

. ^. |- z& A7 G& v* T6 L

x = np.random.randn(n)

; K, H* M6 ?) n

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

& N3 o, \- C1 U! M5 D; T* M

fig1 = plt.figure()

" d9 ?8 y( a# b

plt.plot(x,y,.r)

, y" J, g, e) p/ L

plt.xlabel(x)

7 _! H$ C: T9 M6 F- C. q+ ]

plt.ylabel(y)

# B" |" [1 O. V3 Y* w

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

8 ^/ i2 |1 D0 r/ P3 W

nbins = 200

; K3 k1 C# D* g. b

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

' ~: @' p! w; B

# H needs to be rotated and flipped

- X8 e8 n G) |8 _8 J. [ }7 f

H = np.rot90(H)

6 [* o1 w! a; W% S% e

H = np.flipud(H)

) v7 R, N2 y6 K7 r

# 将zeros mask

& |8 S: |$ y0 ?5 V

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

; q2 B' M5 t( j8 h6 ^

# Plot 2D histogram using pcolor

, u8 I, s* o( g4 o' G/ y2 M2 k& W

fig2 = plt.figure()

( B6 A: S+ A! e1 u; u

plt.pcolormesh(xedges,yedges,Hmasked)

$ c1 `- q% a2 S! ~) s9 e+ M

plt.xlabel(x)

5 k; c: u/ B6 x

plt.ylabel(y)

( L2 s% _4 P2 S9 H+ s0 d# R; j2 v3 o9 P# }

cbar = plt.colorbar()

4 R* C3 r+ k, R& S7 E0 [8 L5 H

cbar.ax.set_ylabel(Counts)

J3 \# r$ a( k- S5 B' E8 N

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

% x" @3 N9 W9 L p) B8 [* W

plt.show()

! d0 ~ c S8 X
9 G. f3 Q2 ?6 @0 v; Y9 [
8 t. l# I2 U/ e% K' |
打开凤凰新闻,查看更多高清图片
/ b8 v2 h$ ~3 R5 Z: \0 \2 j
0 j2 _! s' l2 w8 o2 f- q; ~0 _7 P; \
* v5 C7 l: L" B5 r

_; u' H/ H5 d9 Z. L! w

Example 2 :双Y轴(Python)

4 w& |0 T* o$ G1 o

import csv

$ ]5 s5 d6 M% S6 k

import pandas as pd

1 x: H" ?& U3 U: V' t; A+ f

import matplotlib.pyplot as plt

0 t9 [: {* h& G: C

from datetime import datetime

8 m8 M6 ]2 M2 |4 u

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

r8 y! o8 b0 `1 h c$ K" U

time=data[date [AST]]

" Z3 l. e9 P' }7 \+ F1 a* i

sal=data[salinity]

! ^, h; n: p* V, i6 T; D0 v

tem=data[temperature [C]]

8 s0 W5 p! d! y

print(sal)

t$ q: C$ d) ^$ h: E6 L

DAT = []

/ g2 k T- R; `3 {

for row in time:

4 q/ I. g" k5 t, j+ ^2 K5 w; W

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

" }8 e0 @/ u g" E5 U7 |1 I

#create figure

/ h0 w8 f+ l/ m

fig, ax =plt.subplots(1)

- m4 |; e- `9 J S# ^

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

( _& h6 y% e1 g# g; v* m c2 V

plt.xlabel("Date [AST]")

% _7 v% A* P$ B3 ?4 b3 `

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

$ r, y1 H' B W% E

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

4 S* }; S# H! R! f5 Q% X# S! d

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

1 E1 X5 b6 N$ G1 y3 U

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

: a/ m1 j. W, z3 u0 }

fig.autofmt_xdate(rotation=50)

) j: f' B& s0 ?$ o p. C

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

0 e2 f, E7 Y3 \4 v- M

plt.twinx()

! g7 G( v8 u4 f7 b

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

0 K. O. T# O: S5 n. j

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

# y: t& k/ _! S* k, z# z8 c0 @ }

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

# X0 M9 t3 p- T- F {% K! k

#To save your graph

' `" R: V; ?: z" e$ z1 b& ] P0 H

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

3 K Q2 R' V: X$ f4 E

plt.show()

3 Q0 |' x& Y0 }0 L* y0 q

" X1 y5 _# B; P- r- ~, @

Example 3:拟合曲线(Python)

9 _5 E" @- F* r0 H

import csv

, l5 k7 P7 \1 \; }( A+ a

import numpy as np

* f# h' F$ @+ |2 U8 j# C- Y

import pandas as pd

% w2 M& z( D u, H

from datetime import datetime

6 z% B4 S2 P% Z+ o+ H3 B

import matplotlib.pyplot as plt

/ n4 f! P: C g$ n: i" I0 Z: t

import scipy.signal as signal

/ w* w2 q3 K* f# Z* C* ^7 |9 ~

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

6 }' }4 v+ p: N, M K2 m% z8 }& D

time=data[date [AST]]

9 _5 a' ^! D3 R T

temp=data[temperature [C]]

+ T0 w \1 y2 S% J

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

! B" U4 O5 `+ Y& h# k

DATE,decday = [],[]

# v+ h8 {) H! |" h3 i" }0 g. ?

for row in time:

* q1 r) m4 ^& ~7 k! d: R

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

- z+ x0 j. C; M& O+ d

DATE.append(daterow)

. {" S3 a" C' j* y, Q1 }- J

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

V" `, G6 P0 K9 F9 _' y( d' T; G

# First, design the Buterworth filter

/ n0 s7 P7 S- e$ z6 l) G

N = 2 # Filter order

( C! e, X- R' {; ]6 s) k* S2 [; h; ~

Wn = 0.01 # Cutoff frequency

$ X" M1 ]5 l6 ?% t" Z) t* N

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

6 W; @* L5 N, v" v3 i

# Second, apply the filter

* |$ g8 E$ v3 k( V

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

5 R% k& _* \. A# x) j5 ]! \

# Make plots

+ L0 [! R+ |3 Q; M7 x& v: C

fig = plt.figure()

* H* j% ?4 v- C0 L. q/ d

ax1 = fig.add_subplot(211)

: u) \4 x! X' r; M2 |) ?

plt.plot(decday,temp, b-)

/ x0 |/ g$ G2 y

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

6 \! j3 Q; z% B' d; [7 ^3 l% c

plt.ylabel("Temperature (oC)")

7 c- |9 t. o6 E( G

plt.legend([Original,Filtered])

4 E3 ?) c. D2 L

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

) S2 y) F0 v n& X: L" ?3 f

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

F2 I8 G" N5 }: r( j- }0 }# T

ax1 = fig.add_subplot(212)

) B2 `- e/ M& G2 G, x* p

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

+ Q9 g4 |% I8 J/ |& P7 t

plt.ylabel("Temperature (oC)")

" }1 W' v3 O N" _

plt.xlabel("Date")

6 j* i, i! s `9 d5 `

plt.legend([Residuals])

1 W6 `4 j3 B! z: ~2 b" ]3 n

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

9 w8 B- a& x+ \! e$ a+ r' M0 g, ?

plt.show()

" _6 W9 p G7 z1 w2 T' h

`' |$ i$ P& }5 S# E

Example 4:三维地形(Python)

H; u! c2 w1 e, P' D+ p2 Z6 c% u- x

# This import registers the 3D projection

% N( V' K4 o. u( o

from mpl_toolkits.mplot3d import Axes3D

$ `2 F* I! n+ z9 W: ~

from matplotlib import cbook

. d* c' |1 ]- l" q# H

from matplotlib import cm

+ X, X, Z$ d2 p- I! w5 \

from matplotlib.colors import LightSource

. W: e" h: S; } d

import matplotlib.pyplot as plt

& _! v: O! _ g3 S7 ?/ ?! Q2 q

import numpy as np

, c6 }4 Q; k( x# R9 o! _3 z

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

4 @ v+ i+ t. g; x5 U

with np.load(filename) as dem:

; c1 M. z) G. U

z = dem[elevation]

3 w7 w/ Y: |8 S( | t

nrows, ncols = z.shape

. m( }/ y E" E6 V

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

8 h' @' V2 O( P$ i1 ]" l1 N

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

9 @0 q3 n) _1 O; Z9 ?& C

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

& a$ F; m6 m: q

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

: `* Z5 [! c3 C! r5 q

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

5 V7 U% x- d' ?7 g/ ^

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

9 K/ S2 `6 Y5 p' Y3 \

ls = LightSource(270, 45)

4 h+ q9 k% j: {2 l2 N6 c

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

1 B6 X" l* _6 V

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

. _& ?: _9 u0 j/ w, J& x

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

& Z( v+ a! S+ G( R/ |

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

: V* F6 D% n( x# \, K1 x

plt.show()

" p/ o1 b) ]- U! [5 e9 Q 6 R# w( s: Y3 m) y% a

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

/ h! E+ c- E4 A" d! D% ` & O7 A" x+ [. W5 F% G$ A9 _* \' Z

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

( k8 y$ O& Y8 C , e; _+ H) I8 [# [2 k

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

i# @# f& a! f6 W ; s! H, c( g) X) T% @3 i" g# k

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

7 }& A) ?9 }9 B6 d, K2 x 4 X" y3 \) j2 m8 G4 R( L; K: M1 b

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

6 r$ J) t( A6 ?; A l$ O! V / _4 [/ I) |# Y6 S/ U |* ^7 h
# G% M- J+ {: A' d: U
0 A' V ~- J+ M" |
7 [0 a, K4 V) y6 i W) A 6 s1 {1 C. Y3 `& P. G7 y# @ . G3 J: l! `$ B, S9 G( Q ?9 o" P9 a: B9 q1 m( {) P& D; u2 ]% L8 @2 o& o) _; N
回复

举报 使用道具

相关帖子

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