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

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

[复制链接]
3 P8 h+ j; a+ l3 @9 V% f
# r' G$ O5 p3 c* S A5 ~
! T7 H) s( H1 @6 F
3 d5 f9 R: h7 _/ |0 c9 l0 r

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

& L' R; [6 r* z$ l

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

6 L+ v* U$ q* ]

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

4 [% [, n" A9 {+ F8 i

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

W/ [$ ~6 w' Y' `

import numpy as np

K% O8 Y- p1 A0 k4 H& H

import matplotlib.pyplot as plt

5 s- w( G: H# e4 v. `' D4 X

# 创建随机数

6 o: W: j7 [1 D) I4 O0 ?7 F

n = 100000

6 H+ i1 [) M, s: V1 \3 N/ X

x = np.random.randn(n)

- z' D7 U1 R, {: B

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

9 Z$ Z, }0 g! G; E

fig1 = plt.figure()

! j& {) a5 F% h# r

plt.plot(x,y,.r)

$ y" Q* x7 u) c) h, ~2 O1 G

plt.xlabel(x)

* a6 A8 u' d/ p: }' k3 e( g

plt.ylabel(y)

' `, D. x: b5 Q. m" X

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

* ]5 ~5 z1 `" ]9 g* ^

nbins = 200

! y' D! D+ o' |% O5 o; }2 B

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

5 Z* _' l$ J7 A% J$ \

# H needs to be rotated and flipped

; ]- y7 ^! ]6 p( S8 D1 y* _

H = np.rot90(H)

( X# r" O0 `( ~6 I, a; _

H = np.flipud(H)

: \, }5 ` ]) E" U: Q. L& \. k

# 将zeros mask

7 A# j: W# c1 h: y

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

) v/ J9 a! i( l6 e) Y0 ?/ @

# Plot 2D histogram using pcolor

* h# f' E4 t: c- q# v- ?

fig2 = plt.figure()

9 E$ G+ ]$ i0 k J

plt.pcolormesh(xedges,yedges,Hmasked)

: [+ l$ k/ C7 Y/ a* P* k: F

plt.xlabel(x)

% A* d! y+ m) G+ P" @" ?

plt.ylabel(y)

3 Z8 Y4 K/ @9 y

cbar = plt.colorbar()

4 D+ |* j1 z d2 o$ E1 p

cbar.ax.set_ylabel(Counts)

8 J+ v' D8 C; q0 b

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

3 k6 L3 `: q2 s

plt.show()

/ G/ T% h+ [. w$ \1 T, N8 o
1 `- t$ V3 ~9 }9 x- W% f
/ Y. R9 x8 f) G; C6 b J4 C! d6 H
打开凤凰新闻,查看更多高清图片
8 }+ U3 ]; r* ^
q+ A3 d2 e% G9 W' r. | F
! F; f% C8 p7 v; x& C3 Y0 {7 q

. g& i3 R3 `. Q4 s3 w

Example 2 :双Y轴(Python)

N3 U9 J+ Q, l) i

import csv

+ ^8 v" H0 L" W5 E: `

import pandas as pd

5 b5 [' s& D+ i N! J( c

import matplotlib.pyplot as plt

$ j$ k! Y S& L, w8 U

from datetime import datetime

( a2 ?, @; R0 b& m# j$ c' w& x

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

$ ~1 A- L$ P" O0 E2 X+ e

time=data[date [AST]]

) A6 r9 g$ A2 @

sal=data[salinity]

* u( h5 N. m9 c/ V. ]9 b, ]2 g

tem=data[temperature [C]]

; v, J! y/ m3 c$ R3 g$ \7 o3 ?/ b

print(sal)

6 h# {! ]2 {5 B9 D; m; k; W

DAT = []

/ g( |0 G. t: ^5 t4 J( m' J

for row in time:

; ^3 U1 s& h4 j( H

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

: S1 j- S0 S( M" u$ a3 }0 c% Q- `

#create figure

2 m0 k' B+ p# K3 i6 {$ `

fig, ax =plt.subplots(1)

+ t; Q4 H# R% o" j& U( M

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

/ S* h" w6 R; y- s7 S$ d

plt.xlabel("Date [AST]")

* C( g# b Y z, l) j7 o; o

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

' l" A( r6 ?" C; d4 E

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

- D/ X* N$ P- g6 v

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

: t$ T& l, Z7 b' L$ [, a

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

) ^' r( y/ L+ e0 P

fig.autofmt_xdate(rotation=50)

! D/ ^# E. P5 z# [

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

! ?$ V* ]: Q. B$ {( b# e$ n E9 q' L

plt.twinx()

& |) K: V* f+ c% |, F. f' z s

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

6 J+ m) w- w7 o' g( c6 o

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

2 @. p7 k3 j! l' m# Z2 G( |6 @6 g$ b

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

s Z- w( L: x

#To save your graph

$ P7 p( i. L% A0 C+ w3 N9 L$ w

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

0 z4 ]( {4 ^1 ~9 T

plt.show()

# e" L" ~1 `$ Z9 n& ?- Y8 u

' s2 s7 q, W3 C$ R5 X1 M

Example 3:拟合曲线(Python)

- e6 _1 |4 _+ w, D

import csv

) d6 H( O5 ?" a! v

import numpy as np

# {; q: S( C' A7 W W

import pandas as pd

! ?5 N: y- j1 B c& K: ~8 c& T. u0 c

from datetime import datetime

i4 z# V$ G0 m! G6 O& Y

import matplotlib.pyplot as plt

% X! R+ H6 t o. s

import scipy.signal as signal

1 M5 ]( S, P: Y0 q) j$ J

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

% R# C- H% v% q

time=data[date [AST]]

; ^+ O/ e* ]4 A/ [9 x! E# Z

temp=data[temperature [C]]

0 v g0 n) `+ B+ ^. M* ^2 o& K

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

' R2 a' A+ ^* r

DATE,decday = [],[]

0 d- L, j8 X! c4 B$ U) h0 D8 Z

for row in time:

8 f4 c# r! \# T" W7 s# X3 R2 R

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

8 u' H. Y" w$ K" V+ D. n( ~

DATE.append(daterow)

$ E2 W Q R' T/ {8 J3 M s1 t

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

2 c! q: f4 H* x

# First, design the Buterworth filter

) S! v [' `. U1 i% W

N = 2 # Filter order

* s' T6 w, |, u- X8 q6 W) A/ U

Wn = 0.01 # Cutoff frequency

3 r1 h6 ^+ U3 t7 J5 t

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

+ L0 H( D7 S4 q' p2 K9 P [

# Second, apply the filter

& S! }0 Y2 ?: K8 X. B( Z# d

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

! {' G& D9 i( Z

# Make plots

, c3 l: z4 w O# f/ ~1 B

fig = plt.figure()

3 N Y5 M/ i7 d9 |3 e( e- A

ax1 = fig.add_subplot(211)

# J- d+ {* @" X

plt.plot(decday,temp, b-)

% f( h+ T1 Z$ x3 ^

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

0 l; V6 o; |9 i; v) N/ c

plt.ylabel("Temperature (oC)")

3 z: a( r F2 W

plt.legend([Original,Filtered])

' U6 H+ i/ K0 Q+ B) o+ u$ I. Q

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

# D9 X! _1 w* |( p4 h& s( i8 k

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

8 G% a: s4 w/ D) U/ ]! s' P' K

ax1 = fig.add_subplot(212)

1 G, m- W4 ]8 P o

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

6 T5 _$ x* a1 u

plt.ylabel("Temperature (oC)")

# C" G8 @" t6 u; x

plt.xlabel("Date")

! d w* N# [' k. ?- u

plt.legend([Residuals])

8 a6 ^' ]' L% j' b& t6 b

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

4 r! B' Z% H( I' X/ A0 q: B) c

plt.show()

/ g9 _) |8 d1 O. C

! U0 n' E3 P- k' \# Q

Example 4:三维地形(Python)

6 w3 l: U7 U. q

# This import registers the 3D projection

8 d: Z" q6 y1 K5 H' Z

from mpl_toolkits.mplot3d import Axes3D

* a. k8 L0 C; F. W, o) b4 Z

from matplotlib import cbook

$ K" b% ~7 p1 V. K; k- F

from matplotlib import cm

! t4 i6 t0 J: w y7 n8 E* A$ }

from matplotlib.colors import LightSource

/ s5 z2 u b+ m/ S2 ?/ j7 p

import matplotlib.pyplot as plt

- P& [0 [* ^. G& [' U& x. c

import numpy as np

# G* c0 }4 g$ L% P: I6 X

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

+ A5 Y( u0 `4 ]

with np.load(filename) as dem:

7 b$ U7 n9 S+ S

z = dem[elevation]

4 E9 L( A6 u9 i- m- l

nrows, ncols = z.shape

) u1 D2 f% K$ N: U5 B

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

0 x# i: Y& v+ ~- z. y% D

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

' c, B& x3 j e

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

( h7 X- u8 \4 R6 Q, o6 a

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

, F; j) g; j3 Z- ?! l

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

" P8 \: ?. `2 q$ P2 {

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

5 [/ f8 X; j$ o& b# O- r; n3 o' D

ls = LightSource(270, 45)

% q. i! @+ N+ T% e. N

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

) y: E9 F+ E! z E- v

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

) n1 r# }+ g" E, W8 H9 N

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

8 e V% x' t; v# `

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

3 v* T9 T5 B& I' A3 z5 a) L4 k

plt.show()

9 V5 ^: A# V3 p" `, n3 g" b2 Z0 n ) ^: A! x" g; X' z

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

& l: K, U! N% v# |- P 2 q7 p* i7 `( }7 @% c' s* R

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

1 _# u/ V. o/ N5 ^) _) A, A 6 {1 {1 J! Q, i

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

w9 ~, v/ q) B& i# T + L$ M# P: h/ u6 Z% K M

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

# B. c' ]# n# a' q: ?, l 8 |: ?6 [6 W0 F& K% y7 n2 Z

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

* J4 i* {! W' c# m3 @3 L( t * h; ]7 i: [- I
~! G! H2 |$ L; R8 g" D
5 q0 w" r$ o9 ^9 x2 o5 e
9 w: E) i% g3 e" b7 E9 I2 b" q6 W9 A ( j6 T$ N+ y' x6 B8 d " A$ R2 W# |3 Z; c! a) y! i" x 0 K! }3 Y- d+ D* t1 S) F$ P$ L7 Y; p) c, {' A4 P
回复

举报 使用道具

相关帖子

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