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

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

[复制链接]
& l8 P5 A9 [4 x. f' ~" `& a
- ]% Y8 H9 `# ?8 U4 k; ?7 R s$ j
" p0 ?; G& h- W7 T& A
( ^. s, E4 P' c- G0 M' W+ S+ Q

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

6 Q4 V: Z. H" T3 ?& G, T, J" e

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

6 G1 u4 y+ _4 q! p: {+ N# G! d

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

8 U# I0 a! ]+ b7 t6 l# l) p

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

! n N" f; _: o9 K4 e% f

import numpy as np

6 c2 o7 I# K! p; f$ p6 B2 ^3 a

import matplotlib.pyplot as plt

& \/ @1 C3 U% I J6 w

# 创建随机数

8 O, M6 f' ~$ ]/ q

n = 100000

* D4 y8 Q/ W3 a8 Q6 t+ Z4 [. I

x = np.random.randn(n)

5 w9 B7 |: f) j" x

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

- P6 L+ M6 T' z6 |( ]; v- c

fig1 = plt.figure()

3 v1 k4 f% _# N- h6 \2 r# Q3 O

plt.plot(x,y,.r)

$ N8 N1 p* G p: p8 s( } X1 d8 M" k

plt.xlabel(x)

" _/ S7 p& A/ _, F5 ~7 M

plt.ylabel(y)

. a- L/ R5 T# ^

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

2 o/ L1 J% [9 z. X9 K

nbins = 200

6 X& Q8 E8 o; [6 N/ ?3 ^

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

5 T* d) t3 ^ Y& V: g) g

# H needs to be rotated and flipped

) Z2 }) H. C4 z* {5 s- t: l

H = np.rot90(H)

- i3 d! |4 \( B) X! ?# F. J, G+ {( Y

H = np.flipud(H)

/ w5 t8 G8 b8 _" O/ z& a

# 将zeros mask

2 a+ D4 z L, X5 o9 W5 k/ y

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

2 t; e: E* ~1 q1 a0 G' T+ w+ n7 r

# Plot 2D histogram using pcolor

# f8 ]: c0 d, }$ I

fig2 = plt.figure()

9 V+ I. I5 a2 C; t7 P

plt.pcolormesh(xedges,yedges,Hmasked)

7 e7 F7 T+ } r' d3 s$ u" q

plt.xlabel(x)

$ O( N l2 W! M7 c

plt.ylabel(y)

7 x- o% X6 M) w6 G: P. V; l

cbar = plt.colorbar()

9 h! J; f$ [! d

cbar.ax.set_ylabel(Counts)

. x. _9 Z% |$ Z- Q

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

& V5 D; x! p$ D, e2 F5 O# Z j) E

plt.show()

: h$ A+ |. C5 } d! C
: k, f |% Z# D
8 ]% o) E( N: b7 n% L: ]& J
打开凤凰新闻,查看更多高清图片
y, k# T5 R3 E% M
* ~' F& E% W2 t2 g5 ~% w- V
3 R& `* o: `( S8 o$ N

3 [. K. p( `2 L. X0 R2 O

Example 2 :双Y轴(Python)

- P7 f9 e% H5 a! M) F( o3 _

import csv

; S) Y) s- v0 \" N) U1 Y5 `+ m4 @4 E

import pandas as pd

! `" M; M$ o3 k' H6 ^

import matplotlib.pyplot as plt

7 Y0 T" E5 u# j

from datetime import datetime

+ E. i7 `2 B# {% T1 w* e: F

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

) Q5 t2 B! U* o

time=data[date [AST]]

# d1 m* |4 g' H0 A8 [7 U$ R$ t

sal=data[salinity]

) x5 T) P# B2 P# L* v# f, f! q

tem=data[temperature [C]]

! }2 f% v% i @0 k$ _

print(sal)

0 `9 F# ]% k5 u( x! L

DAT = []

9 V- v/ p4 p% Z4 d3 g

for row in time:

1 W; I* Z q7 p% _* Z7 N

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

, b* J4 ^! r% @0 ~9 m3 u% x

#create figure

; v4 L3 j0 z6 j

fig, ax =plt.subplots(1)

% n4 d' M& N: Q% R

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

; L" ?& I% @2 d5 N4 x: T! O3 c

plt.xlabel("Date [AST]")

% A* W5 I. f6 a( o' K: G

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

0 w6 u e$ v% U: o u4 Y+ U6 V

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

) q0 c! E K H% h3 z* A

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

Z m0 m, r5 P/ p5 b6 K

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

* ]- b& A5 h6 ^+ X, C7 z

fig.autofmt_xdate(rotation=50)

8 s: G' m3 D8 Y& P3 Y: M6 Y

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

8 z5 e" @6 g) {! p' P

plt.twinx()

: F9 w7 @# |) ?9 c7 z2 a5 H9 O. d

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

& {5 N+ E! h, R, n9 N& h4 F# F5 L

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

% u# V8 ^; M0 X0 [

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

9 e# L' K3 T1 P# Q6 T9 B

#To save your graph

" |% Y1 }! F/ D& q. `1 ^- L# B. b

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

9 t3 ?3 x+ \ F" k! f

plt.show()

7 ~5 w1 k# O3 U" Y7 a: ~( O! P9 x

# T! m$ ~' A1 ^( ?3 a7 M

Example 3:拟合曲线(Python)

/ K$ V3 S% F ]$ x9 c

import csv

Z! a U6 a$ D' j

import numpy as np

7 v3 R; h+ o7 j3 I1 j

import pandas as pd

# l/ S4 ?8 B6 l6 ?* @# i& ]

from datetime import datetime

7 R7 @# m8 S/ S

import matplotlib.pyplot as plt

# G5 r5 {( P. Y2 w" e. f, A4 |

import scipy.signal as signal

* {4 H3 H; n8 D

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

( J, W( n' {7 n) I6 O- ~; b) Q* `: L

time=data[date [AST]]

( [5 w+ @3 n) W% A7 X1 N

temp=data[temperature [C]]

$ _5 b; H# ~0 c2 s! ~

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

- N+ Y- y+ R' r1 A

DATE,decday = [],[]

4 p" m: i0 b6 b) _# H

for row in time:

$ l. @! W5 E8 i. D7 P7 D

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

1 @0 J7 r( }# ?% g

DATE.append(daterow)

/ j* \1 Q" {5 E' z* S5 |4 i

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

5 k' m3 P% H) @" v' T

# First, design the Buterworth filter

% x' U3 J; C- T, v

N = 2 # Filter order

* W0 k1 b2 a8 t8 D/ E

Wn = 0.01 # Cutoff frequency

4 X* t' {( C/ u. O/ ^

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

, D0 ~4 A$ w9 ]3 V

# Second, apply the filter

; _1 `8 G* N; W+ {

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

5 ^: \) S" E7 _0 |$ N, k% J

# Make plots

0 v- G9 G8 W. _3 y

fig = plt.figure()

}& y" A& K2 C- _

ax1 = fig.add_subplot(211)

) a- O- S4 x; Z, E+ y

plt.plot(decday,temp, b-)

' `- h$ A" y$ @3 E2 b; U$ [

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

' u; A7 e9 h7 r: I' n1 H. E

plt.ylabel("Temperature (oC)")

( |3 J" P, O+ H4 V, O$ p

plt.legend([Original,Filtered])

. B7 [( E7 D0 W

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

( @# u, D% m& e q6 P1 b4 _. o4 K

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

: l. G( ^4 a% U' n

ax1 = fig.add_subplot(212)

, H8 M' J, H3 H, V4 ] b

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

' c9 L& H% D- M% e

plt.ylabel("Temperature (oC)")

4 a' d8 E' S# I( Q) N% g3 u

plt.xlabel("Date")

5 P7 ~/ @, |; a; q |4 Y

plt.legend([Residuals])

X) w5 U* Y: j$ q5 w/ {! c; f! m

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

/ X. M* Z# o! P

plt.show()

! P7 K& R d% x* I% }+ u j% `

7 Q" M1 m$ o7 ~

Example 4:三维地形(Python)

' P: z1 ~7 o7 N' r& G

# This import registers the 3D projection

) E) k, O$ Z' a+ _6 ^

from mpl_toolkits.mplot3d import Axes3D

# {# b4 D* h# f6 A& [

from matplotlib import cbook

" Y& g: [2 P3 e- F

from matplotlib import cm

5 ]; ~ n' |" K' n5 k

from matplotlib.colors import LightSource

5 j1 ?: @9 L8 l8 ?3 F! R ?

import matplotlib.pyplot as plt

9 K) q; i/ S, K5 k7 A& z; x7 y8 x

import numpy as np

4 C. \% H& F; R- q6 C, V( [% i

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

9 R$ n B0 v- |

with np.load(filename) as dem:

0 D) l3 E0 x6 b2 f6 e# S

z = dem[elevation]

9 W8 J! c2 a7 x! c: X8 M

nrows, ncols = z.shape

N: |. I3 F2 \ ?

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

% C* k* s. Y* V n1 o) I5 F6 P

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

3 e9 d4 G) W( w2 x( P* g, V1 ?

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

& Y$ |* ]2 r& I/ {0 `! m7 V

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

- K; j1 j6 X, j' \& s- ?) C1 C# c

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

5 F. E( N/ |! x7 s' Q! b! b; D/ m

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

7 Y0 w8 N" K$ C- m

ls = LightSource(270, 45)

* S$ s. C" Y$ W+ N$ Q, n3 |- ^

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

; ~3 B0 {) b+ u% j

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

) z) B) b+ c" r( g

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

6 z: M" V0 J. _& }5 g/ \

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

2 Y0 G' w0 A2 H; v( E" L2 z

plt.show()

9 q% C8 d8 {: v# H& r6 U/ I7 E8 l5 c 4 a$ O6 V0 E. e6 o

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

. F% S$ D0 l P8 c) d _ , o2 v! V$ `6 ]7 x: j

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

% v4 F6 u/ n0 k7 K% d % M2 [! J9 w! g u3 S, u

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

) r& K* |$ Y. y1 S8 S o7 T/ R$ Q; S8 F $ r5 V1 U# o6 z- Q

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

2 [1 l' K; m3 ]. x/ e3 q& b' r 9 ]: a% V/ Z* X A2 R$ ^

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

2 F5 q7 Y4 O+ n) b: \ ' x0 Y3 k6 A- i- b
6 y2 }2 _9 e! F" i% s% n2 ^
1 A* e6 L8 c/ I* \
8 o8 f, ~3 w. E- i ; m, I/ K8 t2 | 3 _9 t4 E( z. J6 {& t t' q0 I& @ : E' {3 B2 O; Y9 } * W: v* H* q% C
回复

举报 使用道具

相关帖子

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