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

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

[复制链接]
7 D/ q% F5 I; ^7 [# o9 i5 y1 n
5 [7 Y. M0 G9 R7 X+ f6 C" y) Y: X
- ^* N3 E+ T# b! E
* _. T5 W+ C9 q" | \5 [& Q

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

5 @# D* t2 \3 J) V6 B* [4 \

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

2 X3 w. W6 B B1 }+ ]6 ~. h: L

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

5 h S" i: j6 ^

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

U& H. ]" g$ z! [" z" ]

import numpy as np

1 T# |- h) `8 \: \7 H5 s

import matplotlib.pyplot as plt

$ l# j% q# Z) @5 V |

# 创建随机数

% T+ [3 U' D% a T2 Z( h

n = 100000

) K0 l( S" F) m$ D ]) y

x = np.random.randn(n)

& r$ y; I$ m+ H) d" ]5 u7 {

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

" P0 W: F2 f* ^9 u0 N

fig1 = plt.figure()

5 `/ T+ k0 i" ?: {8 i# I# K, w

plt.plot(x,y,.r)

0 D1 _. \% E2 ^0 G! M8 q

plt.xlabel(x)

( ]+ w7 L& M. U1 ?3 Q% f T

plt.ylabel(y)

* L- Z3 I p! x6 A7 J& ?1 ?& u: ?

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

! s; F: H- p8 A- @

nbins = 200

# s% y4 n0 B- `5 ]

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

; x8 \) I* _3 [& Y+ [1 u

# H needs to be rotated and flipped

" |9 R% T3 O/ S8 R4 b) L8 I

H = np.rot90(H)

1 x; c( y2 s/ S

H = np.flipud(H)

$ w/ r, L# U& b( {8 ^

# 将zeros mask

/ \- Q) x) F% v

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

# t% S) O: G! V$ L- h

# Plot 2D histogram using pcolor

) M2 ~* {2 H) e/ z `

fig2 = plt.figure()

) ^" s! P/ u7 s3 J4 c% H

plt.pcolormesh(xedges,yedges,Hmasked)

; Y) W" N- k M$ y5 H9 Z0 I* D, t

plt.xlabel(x)

& ~2 @* p1 V- ]. z- Z

plt.ylabel(y)

8 \; ~4 L% i5 c5 u8 }/ C

cbar = plt.colorbar()

+ r- C; k" \. N, C3 ~& c' F0 w

cbar.ax.set_ylabel(Counts)

" s$ h+ V; y8 y3 d* \

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

9 |" M- W- p; z! Z

plt.show()

6 F# M. g& O6 {& W' `( R
C8 \8 _3 u$ H$ s2 G0 A# J
5 Y) J# b7 i! F9 u5 K
打开凤凰新闻,查看更多高清图片
; k6 u. n, f+ `; I9 u$ b" [
- J2 _" O0 X" j- t2 Z. g6 i
6 H6 n% D" t- Y6 A. k5 j

0 t% X7 r4 i: e

Example 2 :双Y轴(Python)

9 g* [: G" g( }$ I3 e: B

import csv

9 o% x) D, X e4 i" b, e9 W3 D

import pandas as pd

' c# T2 l# s/ V: O. W( B

import matplotlib.pyplot as plt

( f7 N3 a/ o8 K0 ?

from datetime import datetime

: M& y5 }2 p+ W- ]

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

! d. a: d# ~* n

time=data[date [AST]]

9 w) w9 a' q+ _4 J4 v9 Z

sal=data[salinity]

% G2 D) M. p) f6 f! H5 V! s

tem=data[temperature [C]]

9 M$ @8 v8 J. E% F: ~" u

print(sal)

; J* @( ?( Y) O4 E! \7 d

DAT = []

& f+ l5 ^; S( m8 K# p7 R4 R

for row in time:

8 C ^# ^% y" [0 A5 `& t. g+ B! L

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

. f+ h- P5 ~2 O- Q( J% p

#create figure

& q# F" h' P1 e$ v

fig, ax =plt.subplots(1)

0 g5 e" g$ S5 ]$ z7 p1 |/ G9 x

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

' }0 @% }; q# G9 @( D m. M

plt.xlabel("Date [AST]")

4 `( k( ^0 u3 @9 z. v Q! X

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

3 w9 v B! g2 y: ?

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

" B- {% y3 p" l$ d+ {! C/ l; w' F% i

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

8 H. \+ Y. {; g6 d6 d. }5 R

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

! i, A' N. L: x- ^. u0 d1 m7 D& m$ J

fig.autofmt_xdate(rotation=50)

9 c1 `( k0 G6 b* n! j

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

! ~1 {& {& V1 L# P) Y

plt.twinx()

1 U: S$ A, E2 F6 r- O

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

9 W$ E# E" z# i+ B

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

, W) I0 q$ n. g/ T Z9 M4 x6 V

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

3 S# p! a3 `* e- o/ C3 ]7 ]

#To save your graph

; M1 ?. v- m1 K% E

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

1 ^3 W* D! d$ h" p" o+ d

plt.show()

9 d _2 [0 g6 t6 p1 b

* u# f4 W( l6 J- h" x

Example 3:拟合曲线(Python)

[% o# u' v, ~, }: ]0 L

import csv

! ~" |- Y9 C2 N& K1 g: Y/ b

import numpy as np

: s8 \: ~/ n1 A# g2 l/ v

import pandas as pd

C; ~. q R0 [! ]- |0 Y

from datetime import datetime

) X: C$ t% a' \8 f

import matplotlib.pyplot as plt

) r& G( _" o: q/ H

import scipy.signal as signal

/ {+ s1 W% m+ n1 W* Z8 q

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

; c/ Y) N+ N' v" {- A* z+ c

time=data[date [AST]]

' ~. C& ?! N! Y1 [1 u$ \5 E0 c' m

temp=data[temperature [C]]

" i! j( j, q) l" t; ?$ h$ g3 F$ j

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

) M0 z4 E/ m O% ]+ \

DATE,decday = [],[]

/ z3 V& k+ @# k# i) T7 I

for row in time:

5 k& ~3 ]" R, P+ g' g# a

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

7 A- {) |' a! [

DATE.append(daterow)

9 F1 ~8 V0 w; ?7 R+ K: V

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

% G8 X! W5 ^! ]. c+ O) A

# First, design the Buterworth filter

$ |' `5 }: x" v% i

N = 2 # Filter order

2 \0 p% I& M/ f3 o4 m) |

Wn = 0.01 # Cutoff frequency

5 K# |; H: z7 o1 j5 f

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

e3 ?# @, h, [2 C Z" D

# Second, apply the filter

8 I8 s; ]- U6 Q G; C$ Q+ z

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

* P/ `( I6 e% S

# Make plots

G2 R( O9 W' q2 Y

fig = plt.figure()

. T" X$ _* F0 q

ax1 = fig.add_subplot(211)

9 \9 o8 h/ H4 _- m, A0 }0 P

plt.plot(decday,temp, b-)

8 X2 ?, e" X- N* j

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

( B ^: y( Z3 R# X) [5 z4 R

plt.ylabel("Temperature (oC)")

+ P) V8 I' k1 Q7 w: x

plt.legend([Original,Filtered])

* {' R, }# g9 f+ O8 g" d! L

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

7 Y2 v0 F, `/ }

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

; w6 d1 L9 }1 |! a) t( t- U, @

ax1 = fig.add_subplot(212)

# e& I/ S! Y7 X y, T

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

; T& b, ^) N# w/ A( `- c

plt.ylabel("Temperature (oC)")

5 S7 f+ o2 W2 Z

plt.xlabel("Date")

2 ~$ A! b6 Q o q' v

plt.legend([Residuals])

3 I6 M) @" l$ H1 n6 Q

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

2 O/ l# I w4 H* e

plt.show()

; t) h& m+ X8 [- k

0 f- ], R4 _! E+ W/ b

Example 4:三维地形(Python)

9 s6 @3 ^# f1 ^) f& o0 }3 e

# This import registers the 3D projection

. b1 ?6 V+ L8 a% t, U

from mpl_toolkits.mplot3d import Axes3D

& W5 B/ g6 k( k

from matplotlib import cbook

6 f$ C, {; l0 G' H/ H& i2 U

from matplotlib import cm

3 E+ C1 U1 A$ D+ q' }' x j$ H

from matplotlib.colors import LightSource

. \: o" n; M# u' }( ?1 W6 c' ^

import matplotlib.pyplot as plt

/ F" Z( J& P2 e- F3 v# Y4 O) ?/ O

import numpy as np

+ q8 V# e* n- g. g$ U: m

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

+ W5 D0 _' b5 K6 j% q

with np.load(filename) as dem:

. ^# L/ ?" y8 @' U1 L& d, A; E

z = dem[elevation]

0 p: ~ j) A) R1 |& I+ k

nrows, ncols = z.shape

/ P! a% X# V; O0 U

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

2 ]* A1 H1 F# s5 ?

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

3 O! e* e1 n, Z" x; ?& \

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

6 K: n5 G; s( m. k9 ?' I* C! n

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

4 J' t3 t5 W( M3 J1 H! A7 ?! ]

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

) E, i, v( f, N1 i H2 w, H

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

, A! N: F" S' y

ls = LightSource(270, 45)

; _5 e5 `- K2 W- Q1 e& c

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

" f) ^. {5 r) W1 ^# x T+ X* q% F

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

8 R: v9 K& O) |- _+ ?5 C1 X( O

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

- @9 T# m$ n4 W% N& Y% }

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

4 m1 i8 C7 C. n& D

plt.show()

% I2 t4 S( ]$ s2 [ 4 m! F3 T) c2 g* F9 c

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

, }' q- n6 O3 m ; i6 M2 [3 b0 e0 Q

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

& D6 Y) d) z3 z7 X* s9 f 9 t9 A& I. J' _3 T

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

5 T0 b. O2 u, F$ l 6 ^) y0 K* A' V" B0 t

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

$ r0 o0 p0 m% m: X/ E ; L- g. h6 u4 I" r# B6 s8 q

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

- N7 e. w3 b' l 2 d( y6 }$ A% q1 q
9 D/ |6 o# m3 m/ x3 r, G
1 f3 R3 N( x- q4 E2 `6 i
$ W/ e- ^ R6 z. x9 A, U# { q . s! _6 t, m ~! [/ v1 ]2 Y/ E$ m# s8 d9 X- u/ L- l5 I ( X) ^! Y7 U% ]4 k 6 t* t/ `5 _- S# X2 |# q r9 t4 r
回复

举报 使用道具

相关帖子

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