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

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

[复制链接]
9 g6 S! Z) j& w/ e: A
( o1 R' F7 c5 a" a! h# P; k1 i/ \, a
_4 E2 M6 i% o% o
1 Y* d" E8 s4 h: ^

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

. ]2 D7 i1 r% i! ?6 t, @

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

& U9 N0 D% z$ A1 F

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

" r% X* T* w% H! G2 \6 s* ]

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

0 X7 A4 X: O5 g) S7 @+ J9 u

import numpy as np

" ]+ k% ^3 ]( w' v5 s& i/ p

import matplotlib.pyplot as plt

) c0 d, N G& n; `+ e, y* V

# 创建随机数

4 h" v& f1 M: P' d

n = 100000

5 ?# G6 O6 K" Q

x = np.random.randn(n)

3 R+ i1 S1 {3 l0 Q# U7 S

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

/ r$ f* D: _, X' P) u! d

fig1 = plt.figure()

2 E7 V* z# I8 [

plt.plot(x,y,.r)

6 |5 L# A. e& }

plt.xlabel(x)

1 l: y/ W7 M# h- Y; {) \0 v, k

plt.ylabel(y)

* a6 U, ]* q6 i$ y, { e( [: H

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

; [5 `% r, _% q" S& f& A( B

nbins = 200

/ c% `* s% D! S9 C3 H8 W

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

" q& }$ S" x' v8 [1 d

# H needs to be rotated and flipped

2 D& M' `$ L4 t

H = np.rot90(H)

( z/ L- `$ y2 p

H = np.flipud(H)

, z1 c {- ^' g; A

# 将zeros mask

) u1 z. U' q7 x, d3 L

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

& N3 Y1 D. ~% z% h7 ?

# Plot 2D histogram using pcolor

# i$ z- l! a' c* d. t8 y3 N

fig2 = plt.figure()

4 j* X: J: i, h4 W* A4 j0 N

plt.pcolormesh(xedges,yedges,Hmasked)

" s) W' o4 N" {- {' B$ u. X

plt.xlabel(x)

. t {- F% A: V$ L. n$ ~

plt.ylabel(y)

8 z* L8 h( T/ J/ a4 }7 g- R- d6 s

cbar = plt.colorbar()

* U$ _/ r2 Z, W, K4 Y* C

cbar.ax.set_ylabel(Counts)

0 N0 }* V' r S6 D J K L4 g! n8 U% `

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

5 F4 w" r! d+ J2 g4 U

plt.show()

) D4 {$ K* e9 E# a. _" u
/ c8 o% m/ X+ g! u
) l# u6 |0 C0 |
打开凤凰新闻,查看更多高清图片
5 m0 B+ l/ u6 {1 P" m$ D+ i9 K8 K: ]
" e6 C3 M/ E2 D3 Y, X3 z
2 i8 Z" a5 B* d0 N

: {8 E% F$ _, @3 f

Example 2 :双Y轴(Python)

d- J: a8 a( R, ?: h. w

import csv

% a) R6 j2 W x/ n: K7 i

import pandas as pd

& N1 R* Y( M# \' O0 d3 h

import matplotlib.pyplot as plt

6 T0 e) H6 F7 F1 {+ k G

from datetime import datetime

0 W) d% Z3 x2 @) H! k7 |+ ]

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

$ Q6 l# g) z/ g) ]- {, A% x* b, @8 \' w2 b

time=data[date [AST]]

2 _( h7 L0 v0 p2 G4 w# U* I

sal=data[salinity]

9 Q, ~0 i: _5 G! E

tem=data[temperature [C]]

8 o# Z P- y! i( M: g, c5 ^

print(sal)

: k; X# L' D2 Z! o; ]( U' {

DAT = []

3 g9 `2 E' ^* D ^) d. T; p2 }6 U

for row in time:

& k9 h1 Y/ }5 G- n' Z6 U! @+ k

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

3 u; E% Z4 x( B4 \

#create figure

; t% [+ f- u2 ?9 {

fig, ax =plt.subplots(1)

& n# _7 l% Q3 l6 }3 [3 M

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

, `' p6 g6 Q4 _$ t, v! X

plt.xlabel("Date [AST]")

3 M; y8 z8 u8 l* O( p

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

; L; l9 Y, O4 o2 ~. a

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

5 k6 Q/ A5 j5 ]/ t

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

, P! p0 W* G3 H; A0 q8 ]

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

$ G: B- {) ]" ]

fig.autofmt_xdate(rotation=50)

! g* l2 z' r$ k

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

/ ~; m& K+ A$ o

plt.twinx()

2 x& K/ z7 |& ~1 J0 b: m- V+ W

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

" {7 _9 W7 G! X

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

9 ~- e/ R$ p, t, d: G: Q

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

9 w7 M) w! j; U

#To save your graph

+ j, L o5 d5 |0 S

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

k# }7 x9 R% @. p4 l. H

plt.show()

4 J" N# P2 T0 o# n0 M# i

: o8 j# O" x* }3 K* r& @1 a! x

Example 3:拟合曲线(Python)

$ W- b0 [) Y0 p" u6 N

import csv

2 }9 k0 T1 M | C* Q' g

import numpy as np

9 n- @1 N! T- o) L6 J' R

import pandas as pd

* ?4 _& r% |! Q1 P) B1 }

from datetime import datetime

/ o0 R4 x, X- L9 ^( Q/ l

import matplotlib.pyplot as plt

( z7 {! E. e7 K# M9 C5 ^# m+ F8 K( b

import scipy.signal as signal

$ f+ a* W! h w) ?1 T. L1 y5 F

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

- n5 Y4 z% \% f6 U

time=data[date [AST]]

; j6 U( \# X) \

temp=data[temperature [C]]

1 w+ |7 c. J7 X7 q I( o5 n$ e: d1 {

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

" E# N; k2 i; j, c

DATE,decday = [],[]

6 G: E' s. K4 T6 x

for row in time:

& B! s; k. A7 N; j: s* C

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

: L( t& _' Z) L- o% B. J& q- P

DATE.append(daterow)

; g$ j8 N6 C' m/ |, q0 q

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

; r! y% R l, G) H' h

# First, design the Buterworth filter

' F1 \5 g Y/ }& o5 V' F

N = 2 # Filter order

, e+ ?& C% `. }. ~2 N

Wn = 0.01 # Cutoff frequency

/ M5 H# |: R; S: v: u( z! M

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

# c. J5 X2 p' ?- ^! ~

# Second, apply the filter

& S& K* U; {! O1 Y

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

. n9 V! j- m$ ^; V( u

# Make plots

# p. h9 p$ } v/ W$ O. [

fig = plt.figure()

- S# U+ j4 V% b7 a7 y

ax1 = fig.add_subplot(211)

4 X! L- N5 t" _) n b6 f) Q1 `; u( ~

plt.plot(decday,temp, b-)

7 i/ Z7 ]7 ]$ `8 h

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

- ~- Q& _/ E* X& G5 `4 Y: B

plt.ylabel("Temperature (oC)")

; r, g. [' u F. b0 v2 n

plt.legend([Original,Filtered])

' \- N; f3 l/ q# L1 ^8 ?

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

! K5 x, Y p& B, T6 P# |% z8 @4 e

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

& t2 G2 w/ X% B8 }- A; C

ax1 = fig.add_subplot(212)

+ C% S; R3 T, M2 j" v* i

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

) I& g- J' j1 q% j: b, }

plt.ylabel("Temperature (oC)")

# Q0 Q1 p8 J' M7 X9 Y. t

plt.xlabel("Date")

6 s3 [% @7 _5 V% t+ M

plt.legend([Residuals])

2 a% m) v7 a% a3 z2 M

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

3 w, h/ e. s. ]) m

plt.show()

4 ]) s! W. Y# L, j% L0 T

' D! z! I/ M8 K; G

Example 4:三维地形(Python)

+ t; A( O6 T& Q8 R

# This import registers the 3D projection

, @. Q# s) a5 b5 ]6 V

from mpl_toolkits.mplot3d import Axes3D

5 S# Y) o0 C q/ @) B1 b2 w

from matplotlib import cbook

8 m% G; n4 f. x" {4 M, w. q

from matplotlib import cm

$ w/ b$ o" j, m! |

from matplotlib.colors import LightSource

+ X4 I; E; v. Y% }# e

import matplotlib.pyplot as plt

3 U# F' u7 L* }$ V- Z* }! X& k; @

import numpy as np

) Q2 M6 n% a r- c6 [( w

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

7 h; w" a9 K5 i" }. e! t

with np.load(filename) as dem:

0 O4 T/ L* K4 k1 B# w9 k

z = dem[elevation]

- C4 W5 P. v7 v9 g7 p

nrows, ncols = z.shape

- `, L) X0 H' H3 [$ I- `

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

( q' J9 B! j. P0 m% P" O1 y8 d

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

/ E4 n. `, a: B- s( ]' E/ R

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

, Z9 a$ b# J# M3 z5 b2 W/ F- g8 Z

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

2 @4 p u i* `8 F3 x, n

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

/ Z5 K; M. w! C5 N

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

: \# \3 h" Q( w. U

ls = LightSource(270, 45)

6 w4 N- }$ e8 @3 S, ]. ?# d

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

- U) Y' V( }( ^% v( k9 l! i; r# Q

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

- ^% T8 Y& Q( Z9 z4 L

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

8 t% u, ^/ R+ Z& Y

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

O$ G7 f+ V! v) U- u# R5 \7 i# K" m

plt.show()

# D; x5 a `- F3 p3 Z2 R - ]& h3 s5 d1 U/ n2 [

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

3 ?2 I$ L e# b. Z0 n+ ` @- ~! K# `- C, v: u7 M

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

) C7 S- {5 D9 o' B" I" v2 @. x% i 1 ^" J) G7 p Q( d8 P. J

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

2 s+ p1 A) t9 n" E1 w+ A 3 K7 t( t/ w+ N( L1 o- m* ]

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

# r7 o4 `% d2 R0 Y/ c1 `0 e D 0 A4 @! W& g5 p1 j' P! G! e

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

1 @7 K( R4 O& E5 d 9 F/ {- }+ w( |$ u1 @' l0 k
( u! C) b% @; |$ t5 x
( N# d; H* E& s0 H- _
! F4 }' e4 w: }/ u0 A( s , A# t6 w0 N& a* J- i( D, g1 v+ L# e+ H 2 }! p& \% a: ~ : h: c% p% K7 {( `' w" t
回复

举报 使用道具

相关帖子

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