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

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

[复制链接]
7 B1 }1 R9 @5 a
2 ?( b- u9 R' N1 b' Y
0 z @2 d( W$ ]6 {! D4 f" ^
7 O3 R- ]0 ?5 e2 N% G3 \( D6 I

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

6 X. x2 N" |" O7 J: j3 x! I7 x2 R

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

. l `- y \6 A7 [+ ?5 m' m

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

( J+ x" Z( i R' b$ g4 N

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

* t0 t+ b: g' ^# W0 d3 |# Z5 m( L& H

import numpy as np

% c F- S: W# i- H8 {/ k

import matplotlib.pyplot as plt

1 B. g3 t" W5 Z0 Z" L

# 创建随机数

, L9 h$ o* p4 Y* l; }/ N: `

n = 100000

' X$ P3 X3 a2 [0 ]4 |3 L8 s

x = np.random.randn(n)

W( V2 K, c2 M6 q- e% t

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

. o z% L7 p5 Z1 y- Y5 l' |

fig1 = plt.figure()

4 k: o8 N7 g0 t: N3 A2 l9 J/ L$ Z

plt.plot(x,y,.r)

& [- ]' W7 S' K8 d- t4 [

plt.xlabel(x)

4 D9 S5 k$ i% z% V

plt.ylabel(y)

! L4 j8 Y6 b" J" A; a6 D' d' b

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

4 W$ k9 _2 K6 C: J! C, i( v$ L# ?9 Q

nbins = 200

8 U: I8 `) V- r/ ?. T

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

3 k* N; ^( p7 g7 a

# H needs to be rotated and flipped

6 x1 W1 z. a# G

H = np.rot90(H)

2 d2 M# l7 |9 n

H = np.flipud(H)

. N. \1 Q3 `+ @+ U& [ p$ A/ t! f

# 将zeros mask

6 p1 T; ~3 f$ a7 s- b

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

: T+ I. x, E8 }9 Y- Z

# Plot 2D histogram using pcolor

; Y9 J% k% e7 s& H) I5 @

fig2 = plt.figure()

3 E8 B, q) P- @8 n. K

plt.pcolormesh(xedges,yedges,Hmasked)

6 O1 `3 y* K" l; s3 \4 c

plt.xlabel(x)

9 Q1 x/ H4 i% ]0 M/ x7 ^; |3 I

plt.ylabel(y)

4 ?' i D: p, t+ A: Q+ g: E" g) a

cbar = plt.colorbar()

2 a; j9 \5 u9 |! \4 @' [; y1 t

cbar.ax.set_ylabel(Counts)

: n$ k5 g6 S4 Z" v9 d" t3 C+ ?

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

# d# k1 @! }" Y' ^% D) y# M

plt.show()

/ S4 ]+ ^$ A& u; v
3 }' ]6 Y2 n" ?# C7 e; D
! [; s1 @$ T$ Q& ^: z$ W7 [
打开凤凰新闻,查看更多高清图片
9 J, @! |$ L* v) |
! ?$ x" K7 _: U8 p5 n
. I" h5 @+ J% L: B

0 F: l: R" y8 f2 j) \

Example 2 :双Y轴(Python)

* @8 G" r4 [: f* r9 F

import csv

" v) S8 {- `6 r, O

import pandas as pd

1 F: c" T; A" {

import matplotlib.pyplot as plt

3 f4 e! C F4 M F

from datetime import datetime

" V0 V: U1 c& q# { k6 @! e

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

8 R' ^' e. y* J7 x4 p+ y$ n

time=data[date [AST]]

, n! @% }8 [) B9 i3 p

sal=data[salinity]

8 d- B L0 K$ F9 C; U& x4 G! N

tem=data[temperature [C]]

/ S6 v/ Y/ ?( y

print(sal)

+ v& W) r; o& W2 _

DAT = []

( y/ R7 p4 ^& x+ [2 ]0 |

for row in time:

( E$ x* ]* Y8 u/ V$ e

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

4 G) M7 a! @- ]( D0 w

#create figure

" `' P" @1 Y; ], D) d U

fig, ax =plt.subplots(1)

& C8 S1 r( I+ k' b% J

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

; j- s0 a A6 L5 @3 O

plt.xlabel("Date [AST]")

& C6 v, F) b' |$ t

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

/ X2 O8 e3 \, X8 p; B! [. ~5 d

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

$ q0 ^. B) K# R/ t, ]

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

3 }1 x3 @6 {8 v2 ^

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

) T1 `3 k! F' }

fig.autofmt_xdate(rotation=50)

: d6 i7 G4 U* a' Q2 U

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

0 }, W) Q* {* q- a( k6 Z `$ |% H

plt.twinx()

% [# Z4 V& J# |+ E

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

( W( J7 y; u5 C! I% I

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

( i2 I* D! `" N$ n$ K1 H. X

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

7 C$ g9 Q2 J& h( I u

#To save your graph

, d5 p. `" Z9 n! V z- a- H( s

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

& {" b; P8 X9 y4 I9 R0 C }; j

plt.show()

6 w. m9 ^# _4 ^$ B4 W5 M) {3 v0 t

# k) m' Z+ `3 e- Q% Q- N; t

Example 3:拟合曲线(Python)

* `' |+ v5 l# d7 j3 T8 o

import csv

3 g# l6 n1 b& u5 y2 l0 A

import numpy as np

6 g% e$ P2 D. c0 t6 R0 ?1 t

import pandas as pd

8 i# Q: c8 J) Y: a& o' h: k

from datetime import datetime

2 R4 z1 `. {9 o% H# v

import matplotlib.pyplot as plt

2 V. h# n6 e1 `* O: ~

import scipy.signal as signal

9 j, m7 ]0 S6 {" `# W

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

: D% F1 O' r5 [, W

time=data[date [AST]]

D# W2 m3 _; ~: K4 h4 L

temp=data[temperature [C]]

! ]2 x! {% Z7 T! O

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

4 K+ w M- o) y/ [ P- a

DATE,decday = [],[]

. A1 _6 I \; X

for row in time:

6 t+ f6 W, L; O2 E4 N' d0 h( }

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

' I4 x A J5 {% P

DATE.append(daterow)

2 H5 n/ M1 B+ A5 i7 j* Y

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

7 _9 L+ _2 _2 c7 `7 \& u9 m5 b3 K4 C

# First, design the Buterworth filter

^& M8 j7 D. z0 ~

N = 2 # Filter order

( J; u9 W6 Y; z6 A+ ?

Wn = 0.01 # Cutoff frequency

7 l; Z L8 ^- T2 C- K

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

! U' L* `' h8 Z1 j7 B

# Second, apply the filter

6 d% K8 v3 S9 H

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

7 v, F0 b- i$ W5 m

# Make plots

# Y/ t, g$ m4 D3 L' H

fig = plt.figure()

: U' k) R+ V3 ?- K

ax1 = fig.add_subplot(211)

& Z* m6 R8 J$ |! H

plt.plot(decday,temp, b-)

# p5 ]2 v, g7 F' j/ D

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

B8 p: Q1 b* F/ a& g$ w! w

plt.ylabel("Temperature (oC)")

7 p2 H% _5 d- Q4 z

plt.legend([Original,Filtered])

. {) W! q; l0 @3 i$ \- r7 j% }

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

& T6 r k+ d$ V! j2 W" G

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

+ p4 r) |5 e" ~1 r

ax1 = fig.add_subplot(212)

$ O0 t! s0 c: v( d- A

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

' h. F) q5 Y, g% X# Q: C: h- v

plt.ylabel("Temperature (oC)")

) Y! Q5 Z9 f3 g0 T

plt.xlabel("Date")

% W0 L0 l: L6 ^

plt.legend([Residuals])

& l. G6 E. _- V4 ^

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

5 [2 V2 d9 Q# N3 ^; S4 W0 q- A; \

plt.show()

3 k$ i; c6 e Q. j' z

% Q" a. f* a" ]7 l

Example 4:三维地形(Python)

$ s; ~- ~* Z" F6 ~5 ?2 M, g% ~+ F

# This import registers the 3D projection

; K* ~& L: e2 m/ F

from mpl_toolkits.mplot3d import Axes3D

; m, ~. n3 c% i: X% H$ Y

from matplotlib import cbook

$ a, O4 [2 E, W! F) ^

from matplotlib import cm

6 s; X: j: v( n: z

from matplotlib.colors import LightSource

# {, X8 G! J: [9 h/ ?

import matplotlib.pyplot as plt

5 C- K0 Y8 N8 S+ A, X

import numpy as np

6 ?% m: c0 F% U! ]& F8 t4 {4 N

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

# m/ M3 M5 x* B- R$ i% ?

with np.load(filename) as dem:

4 _4 i& r1 H' m; v7 O# n

z = dem[elevation]

N& i& |$ c' q' u; v

nrows, ncols = z.shape

. K9 \+ ~7 j8 J. R' S8 D

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

C' w2 |- X* Z- ^( L

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

* ~2 I! @2 k6 m( D. l

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

0 q4 k4 k; {# F7 f

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

4 L! H9 N" L7 x5 A' v' N# f, I

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

* c, t. K' W: v& M

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

; u5 g2 W% t! W" l6 ?! ?5 D4 ?+ H

ls = LightSource(270, 45)

' S ]; p6 t: B, S. h, v3 R9 V

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

: s5 }' f2 p0 o

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

- P9 ?7 F* ], Q

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

: o4 c0 z7 P5 ?" ~& F

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

I0 Z7 I2 n! o9 J

plt.show()

) ]9 v0 A1 L+ Q( l* U$ h' j) ]- V 0 k! w/ v; C) k" ~0 i. p$ j

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

6 r. \7 o B+ T* n& I & P0 i# v% r" Q; i0 p

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

* p1 ^+ t+ a% Q* K5 _; e- `2 ^0 L " R7 ~- j4 ]/ }+ r7 y

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

1 Z: c1 P- W9 i# t9 ] 1 F2 L5 r5 p) N. P: F9 Q% O" P

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

- G! c/ ~" G8 r- ? k$ ^ 7 G4 I) s$ t m* n, L

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

2 ~' p8 i% d: W" P 7 h2 {4 P4 @& Y
+ Q9 i2 N' {% y; a
0 C: ]9 c* G& t9 F; j# \1 M
) ?0 e0 Y+ Q# V( a7 P" D, } 7 v$ e1 @+ \. V) \" Q * y! J1 q+ x# X; G' \6 b" J: z0 V9 [: @. u- E + |0 M) A, M0 i9 a( d6 p
回复

举报 使用道具

相关帖子

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