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

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

[复制链接]
* G& ^! s) a$ ^# T, |: M" J: B8 @
% D8 K& M n6 t( E, ?" l
2 U: k6 O' U! P) B1 F' Q% Y5 [2 X
/ i9 }2 s) i+ l- s% l

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

- k" K S" ]& O$ p$ ^3 H* E

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

9 t" [# R* y+ d0 s

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

* M" g8 H+ R2 I. a( F

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

, }( `( X! ~3 M8 q" e

import numpy as np

4 z8 y, @! \! P: d/ X

import matplotlib.pyplot as plt

, L$ v' z9 _, M7 [6 J' _. b8 j5 f8 G

# 创建随机数

% y% x, [- E' P# q

n = 100000

2 c+ @( h# G9 y: q4 w ]5 o

x = np.random.randn(n)

4 k5 A, ~! A! X& W

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

- {5 @2 ?% h: W# ~* y" U) Q

fig1 = plt.figure()

$ [# D, }: v1 h! M9 g# p

plt.plot(x,y,.r)

1 s7 ~! ~9 _" }; c; Q3 ?1 W. {; e( W

plt.xlabel(x)

- q* l) ~1 _- l, _6 h4 y

plt.ylabel(y)

+ t- Z+ }* Y A8 M2 X$ v6 V

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

0 p7 m+ b: d% w2 h

nbins = 200

5 Q7 r: y+ P' [# X4 Q

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

' V% K |9 c' g6 F- _: _% K2 W: n

# H needs to be rotated and flipped

4 g o H M4 H7 i& t

H = np.rot90(H)

' u# Y; p# O; s' u ~

H = np.flipud(H)

8 X( l& R% |, t+ P( @

# 将zeros mask

# B+ g8 }+ Z* Y. b8 ~# c% f$ W

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

' F1 S" z, m) |' f( i' F E

# Plot 2D histogram using pcolor

8 O1 `- b+ d+ {% k1 O) u

fig2 = plt.figure()

7 |+ H" v1 Y- ]

plt.pcolormesh(xedges,yedges,Hmasked)

1 ^1 J8 Z8 }0 m1 `5 i4 S1 V

plt.xlabel(x)

& Y4 o# m1 k# ?

plt.ylabel(y)

, z8 S8 R3 C o' X/ x: O; v

cbar = plt.colorbar()

* a* u8 B: B1 r0 |" m( p

cbar.ax.set_ylabel(Counts)

* N0 j( K# O* | ?+ h' M0 O

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

& d! a5 S- {8 I: w& B# W$ ~- n5 {9 z

plt.show()

: p' q2 @ u+ T
% e0 ~6 K2 I( K" U/ E% h3 {
. L2 f0 n9 L# S0 E' U
打开凤凰新闻,查看更多高清图片
( B6 y- y/ g: H/ ?& G
# c% H' E/ W3 b$ m9 E% N2 p
7 _: w3 L$ ?3 F

. K: X' I' A# n- j. @

Example 2 :双Y轴(Python)

; O0 G c' T( h2 N# N! J( K

import csv

: ~+ [9 L2 a( z

import pandas as pd

7 J W, ~6 x' h2 W* F8 ~4 Y

import matplotlib.pyplot as plt

7 @3 z7 V4 J1 I8 I

from datetime import datetime

5 X6 V8 @" e& b7 \

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

. K4 Y B @- { c0 O6 H

time=data[date [AST]]

6 W/ C+ f; c6 H+ f

sal=data[salinity]

4 a# I/ N+ p6 K& y& q$ w

tem=data[temperature [C]]

* i7 ]% k; N$ d6 u3 q0 r

print(sal)

+ h; T* e- U) H/ f% V: D0 `" A

DAT = []

" k0 x2 w. i3 z& W1 o j. k3 J

for row in time:

$ _# ], \% W0 _8 u" N" y2 i: s4 E3 d

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

; j" e# Z1 U. F1 t

#create figure

7 T- e& Y7 ]0 V2 B" y. I% {$ x- v; J

fig, ax =plt.subplots(1)

" R" a. p, ?8 x7 f1 E

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

. x0 P& z1 t- l# G( v. {0 N- |

plt.xlabel("Date [AST]")

0 ^( h" J) \; Y$ o3 C) v

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

: l% V. F/ v) r) Z/ k

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

1 k( z) e$ k S# w* D! H6 |5 x

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

6 c6 D: @7 J! S. q+ n- ]6 F

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

% L: D$ L, q8 C& M+ [

fig.autofmt_xdate(rotation=50)

g( b" F3 ^' g+ ?9 {

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

( u* ?- w6 s& ^

plt.twinx()

$ T9 m* p! e' `. ]/ N3 M

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

! _, ~' |( l, e' D V# f+ B& ]8 {

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

% b) m* O \/ \' a( W

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

9 _; C: _( m7 u! v3 Q

#To save your graph

0 g9 Y7 d3 a, m, V) \

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

: ] ~5 F0 G! q# H

plt.show()

5 m. ^0 A+ I0 B# X6 `

) U2 y& H3 [1 N, z+ ]3 D6 k

Example 3:拟合曲线(Python)

# ?2 n, o( }' @0 `" [: J

import csv

5 x- {% Y2 N, [* o; x# O0 m' n

import numpy as np

* L2 W6 }- c; H, R0 A3 k

import pandas as pd

' x# |& L' h8 v$ M

from datetime import datetime

' `' @3 p5 R3 e! ~

import matplotlib.pyplot as plt

% v* ]1 v6 N1 _3 a* g

import scipy.signal as signal

6 ~& r/ O# @) v; U

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

: B" }* P" D/ ?# p4 S( K

time=data[date [AST]]

2 ^. w) Q; P, @ o* a

temp=data[temperature [C]]

e/ ?3 _* p I3 @* [2 d9 K

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

- O3 M% v5 x3 l' v0 w/ i

DATE,decday = [],[]

, b+ y# V- l3 t4 M! j

for row in time:

+ l5 D8 S3 @3 o3 z. p9 I+ V T6 {' N; o

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

4 _" ]( j( v |! s5 O2 ?2 d) v

DATE.append(daterow)

2 z5 D p2 ]& \4 o" U

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

; n5 b% T+ E, x# l

# First, design the Buterworth filter

$ B# Q! g6 X7 j: M; N% v4 c4 [

N = 2 # Filter order

+ {8 ?0 k4 C* b+ ^: B& o3 {

Wn = 0.01 # Cutoff frequency

+ n' _/ c8 K9 k( }% z$ r3 h6 W9 L

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

+ {/ p( u* V2 Y6 N1 g

# Second, apply the filter

4 o0 g9 F/ l, G8 W* w

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

& E! }! J* b3 X0 Q2 M2 n

# Make plots

6 h% @: V; P$ \

fig = plt.figure()

* e# r& C3 ~% z8 P6 S* I1 V2 o

ax1 = fig.add_subplot(211)

, ]# J0 ]0 l: C N1 R

plt.plot(decday,temp, b-)

( y; [# r0 E! R: ~1 E6 \7 R; p

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

0 ~1 m) I; h! k# g- M

plt.ylabel("Temperature (oC)")

* i4 B! }$ U( Y

plt.legend([Original,Filtered])

+ o0 Z/ \5 B" m0 ]8 h2 b" J4 |

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

% M. m G) `! I! i' T

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

7 v% \" B6 q+ _9 R" D1 X- S

ax1 = fig.add_subplot(212)

. d+ Z+ K9 Z1 ]1 f0 v% Y0 P; S$ G

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

* l% Y& u" X6 S0 s+ T) B. c, }

plt.ylabel("Temperature (oC)")

: Y; p6 j. O2 x

plt.xlabel("Date")

' d. w6 X' g+ w* \6 Y

plt.legend([Residuals])

8 P1 W4 K6 M ~

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

+ r8 M: s3 [) L% g* J# G8 v

plt.show()

/ {6 e2 q" s( O# s8 t

* b2 f( z* K) l- ^

Example 4:三维地形(Python)

3 a/ a) Q3 E' ^- A# h: l

# This import registers the 3D projection

3 J! F, y! }0 K2 Q: O: s

from mpl_toolkits.mplot3d import Axes3D

. }1 d. J' p/ p- E F" {1 O

from matplotlib import cbook

/ l7 ^; N) R* q/ @+ l2 `2 D

from matplotlib import cm

' z: ?3 F* R% f# ^9 W6 T+ x

from matplotlib.colors import LightSource

3 F" p$ ^0 U# S# G* c2 v

import matplotlib.pyplot as plt

$ J' `4 |: U- e, [

import numpy as np

9 m6 V3 u1 @! g7 h: E5 ^7 u1 `9 k

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

8 p, x4 S. C3 o& e! h/ ~6 u5 m

with np.load(filename) as dem:

/ {$ H5 y% N* K3 @

z = dem[elevation]

! F, V; l5 x! x; q

nrows, ncols = z.shape

0 e6 j# {/ p! {+ W% v$ h( E

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

" b. N7 c/ _, t) S0 {2 n1 | Y

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

$ m( i' m1 ?, g( M% t# ~

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

8 q% z+ R6 S: l" A' M8 x$ W

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

* q! [* ^! d$ Y% w7 _9 M. C

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

" k7 T8 d3 l% ^9 g6 e

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

1 i) f0 E. ^4 ]$ T

ls = LightSource(270, 45)

3 Z0 U9 {5 Q5 {; P0 {2 g" y8 l" M

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

+ O5 W! _' Z$ V3 Q, Q

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

# O2 ? X$ t- w9 {' W n

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

: _/ X( i( u0 u1 C9 h) q) f

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

: f; O% O U9 V% j

plt.show()

( S' M- ?; z2 N* Q/ ~ 2 S7 l% a/ @. u1 w8 L* _/ g* p

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

5 Y7 O. Z. u; d$ ] 6 k1 ]7 |+ m* e# L/ r1 W2 C

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

+ V, X0 Q7 [( h , Y4 P9 }: C$ D+ g" k

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

; V+ N6 C3 T4 s& h/ J # D( V3 \/ H3 _2 X, ?) y3 Y

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

1 ^3 A9 P, _1 ^$ i 7 c+ C9 B6 N" u' h8 c6 L

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

4 K5 f. ]5 k* ~' ]0 o2 A6 E; R( T ' f! b, T, j6 U" ], d+ e
. [ a& ^" e+ O( K9 G6 A
( j; S! x/ s, ] R q0 ^" b
$ i, v2 K! N1 a+ J3 o( x# n9 P2 V* a - n; t) g4 Z% n' ^7 W ; M) h/ X; T, p/ _+ y9 L1 p8 @. m+ X) p( O, \ ' v% n0 N {+ t3 M
回复

举报 使用道具

相关帖子

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