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

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

[复制链接]
8 X* o" n9 p" R+ X0 k
, `8 p7 X/ c; J: ^2 o# ~
# C' n- i% t9 m0 G& q: B
. a! h7 @4 P- `

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

* `% i! U. f3 J0 o% _! J9 d

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

9 H& W' H# l9 t+ P

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

3 \/ G" T6 ^* T4 Z/ @9 B* u

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

# @5 ~' M$ n6 ~4 F' y

import numpy as np

, P. G; [9 I# P# x; t( u

import matplotlib.pyplot as plt

7 y6 `. ^& I0 B; \" ~$ v

# 创建随机数

7 q: Z% M6 s) H/ ]3 o, A$ `; m, r

n = 100000

1 o" C: a ~' |9 h

x = np.random.randn(n)

2 f8 j7 U6 d) _9 U& o, `, q8 N

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

( @6 N5 r0 C& ^2 x+ ]4 Z

fig1 = plt.figure()

6 H' o& l# v7 m" A# z. w

plt.plot(x,y,.r)

& F, Y5 R$ ]( Z f2 ]

plt.xlabel(x)

# B; P, h5 D. z- j3 ]$ p1 M

plt.ylabel(y)

* N9 }% q" g" A: J; s

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

, k v- Y O5 Z8 i

nbins = 200

. d' U& ~% T, u ]2 X, {+ _

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

' G$ m. z" M* t

# H needs to be rotated and flipped

8 G8 f3 h" j% M

H = np.rot90(H)

9 w$ w# t x. t# w8 ~0 A

H = np.flipud(H)

0 |! T a, M2 R% }* b1 j; v

# 将zeros mask

* f$ e, b9 i& z* L! s5 j& M8 x

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

: f9 C# X% i0 _# u# q

# Plot 2D histogram using pcolor

1 [0 q5 [7 O& O: `4 G v/ }& h

fig2 = plt.figure()

5 ?; h$ a6 z" A/ U

plt.pcolormesh(xedges,yedges,Hmasked)

* t% Z, A9 M+ I4 O8 g1 S

plt.xlabel(x)

! Z1 h0 E; e1 k, E! M3 c+ `9 u2 y

plt.ylabel(y)

* Y- O+ s2 n; j

cbar = plt.colorbar()

9 f6 k. [" J# p

cbar.ax.set_ylabel(Counts)

" E; d) V/ \6 }# H2 s ?

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

5 z3 @0 y: }" ]0 W. R/ J; U2 x7 C, b

plt.show()

; A4 F7 |% n9 C0 ?0 p
' v; i6 Q% }$ |8 u% T) g3 t3 X
G9 e6 Y/ S3 R W/ a9 U
打开凤凰新闻,查看更多高清图片
! U7 K: x" ~* \
' B) n, m$ R9 X" @1 H
$ D q( o( R# T- h) E6 ^ z

% Q/ O9 j+ E6 c* ?

Example 2 :双Y轴(Python)

) ~# s6 i6 v1 m" y/ @+ N

import csv

8 q3 r/ y0 S% D$ c

import pandas as pd

1 X2 M5 K9 t' b/ s7 N

import matplotlib.pyplot as plt

$ n. z) K- }$ X3 I/ N9 T

from datetime import datetime

+ Q ^/ p6 Q% B3 N

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

6 l4 N$ a: M- Y. z7 V

time=data[date [AST]]

3 k0 ]2 t6 c |0 A

sal=data[salinity]

% a* e% R" c0 P1 @% A; r

tem=data[temperature [C]]

9 S. `. t7 A: ^( v& H6 @

print(sal)

* u0 N0 V# A* u) r- t# g

DAT = []

# u" n# n2 p3 x7 f

for row in time:

) A7 R# v; u( u; E, J/ e

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

0 b+ ^& u3 u9 ?( A, y

#create figure

# e9 i( Q+ G0 x0 K

fig, ax =plt.subplots(1)

9 [/ B1 M) V- S

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

, f- ~2 { d0 ]! I9 w

plt.xlabel("Date [AST]")

( O B7 \) Z' N

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

) g: O+ i1 ?: y; k/ n2 j3 _, Z

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

4 S+ Q3 s/ M( s) b

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

4 o( N( @; Y" h" e8 s7 ]

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

# Z' L( F) c2 \# \

fig.autofmt_xdate(rotation=50)

2 A1 J' X8 t+ H2 r6 {

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

* l8 t. r# |! d! v. b4 k$ e" M8 ]

plt.twinx()

- Y/ n% {8 h+ G1 y" W

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

) z& ?3 L# {$ ^9 G

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

* v6 E! b3 Q+ E! \

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

+ \, z. R+ R" n% T

#To save your graph

# t" g, R8 T( F4 ]+ p; L

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

O' c1 S h2 T4 \1 h0 Z, ]

plt.show()

2 t* i7 C8 [2 R* \

( @- r0 L) r1 X( p9 r

Example 3:拟合曲线(Python)

9 r: B4 i/ F- p5 f6 Q

import csv

, E2 H/ |# y( S, e) Y& J/ A

import numpy as np

0 X( V! A1 r% Q: `9 }% E7 b; k- K1 u

import pandas as pd

$ i4 X3 w i. W/ j. \

from datetime import datetime

0 d( z) ^( Q' U% k5 N2 _

import matplotlib.pyplot as plt

6 S( Z5 A( N5 l8 Q& g: o

import scipy.signal as signal

1 H& U; T5 r$ N6 Z6 Y

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

, p1 Y/ o* l k9 m2 p

time=data[date [AST]]

4 E+ V3 N/ J2 l+ d0 S2 u$ t

temp=data[temperature [C]]

) j. ?/ P4 O* a; U

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

) d- `& K( w: P" N+ c7 F

DATE,decday = [],[]

! S; j% _4 R; c$ R) S# B

for row in time:

: e- r1 d5 f8 e# W2 z

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

* z- j1 t. ]( O ~! |+ K

DATE.append(daterow)

' h/ \, l9 U. B& i

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

* l0 s" d% y# z+ q. Y2 u

# First, design the Buterworth filter

; v( k; D- y; F' v4 b1 r+ q

N = 2 # Filter order

* }- @+ H" ?- ?

Wn = 0.01 # Cutoff frequency

2 w9 v2 ?2 z) n d! V, O

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

0 a8 n9 c& y# ^& k3 D ~+ z* c

# Second, apply the filter

, [, E% E. B. ^/ L; x

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

3 w) z5 x. ]7 _0 S* H: I: @7 T3 x

# Make plots

7 ^; e# y* o# p$ k' w

fig = plt.figure()

% `) }7 o; N# g4 I

ax1 = fig.add_subplot(211)

; E/ m1 k5 i, M6 x5 c- Z6 u

plt.plot(decday,temp, b-)

4 r _# o, N4 y

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

! v' f& y: G' ^0 M7 \, r; {

plt.ylabel("Temperature (oC)")

, `' [+ w- g% H+ q

plt.legend([Original,Filtered])

' ]7 j4 l" m- E, q

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

; l, }: O0 O* w2 s: U9 k: s- {

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

; ~# l, K! D3 A8 L) s; W4 x! _% h

ax1 = fig.add_subplot(212)

, k( c1 j6 Q. j9 g, E% w6 \

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

W. D# G1 {4 f! ?

plt.ylabel("Temperature (oC)")

8 A" \1 o- b% v& v+ m' F- V* W

plt.xlabel("Date")

7 `3 K+ A3 e, Y4 L+ v

plt.legend([Residuals])

+ p. W) Q$ x8 x7 x( l1 w

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

# E- q2 ]; ~1 C# `1 A: L; {

plt.show()

. ~' c" ` z5 @7 ^! o1 t$ l# }& m

0 Z+ A8 s% f5 Z4 \7 F

Example 4:三维地形(Python)

4 A7 J3 k$ {, B, n6 \/ J3 A

# This import registers the 3D projection

9 ?1 P9 V$ `0 Q5 P9 s. s

from mpl_toolkits.mplot3d import Axes3D

, h, v3 j) y# j6 l8 ]4 n% [1 R3 n+ s

from matplotlib import cbook

% F6 H( w* t- S0 @# u7 K

from matplotlib import cm

. G3 |1 U# }7 ~- B% s+ g

from matplotlib.colors import LightSource

, r2 L/ F8 T" y8 i8 O' W

import matplotlib.pyplot as plt

% I( p+ W0 j* ~( E! a2 U+ M

import numpy as np

5 ~* w8 w. a: Y3 X7 I

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

% {# B1 J/ Q5 r2 o4 Z: J

with np.load(filename) as dem:

5 ?" L% ]$ g2 m: p

z = dem[elevation]

( T# m0 {1 {9 E8 s

nrows, ncols = z.shape

# B6 n" q7 Z& S, i1 f

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

k7 m0 d- `& E

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

' L6 W6 S' m4 @, @

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

g& \3 D8 A: n( l

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

. m7 K5 D5 h, c1 S i5 U

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

: [% [$ o( X Z

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

- f* {4 L' I0 e* x4 U; \$ n

ls = LightSource(270, 45)

9 z- e0 S) Z* X' h

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

) r7 u+ U7 z: E0 g2 e

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

( z5 P4 Q- M6 a& |7 v J) X& i

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

m$ `5 k$ @7 s0 ~

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

6 D; P/ [- W4 z# ^' ], `, K

plt.show()

; U' Z# D" a5 H: l+ b$ R) {7 K2 Q V, i! C" [9 Q4 u( J

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

# W% t8 h/ i! F$ g, V * t% z S/ T0 u- [

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

q7 h0 j4 F2 h0 C0 s# v8 k* Q 8 t& C+ f* H( R' C

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

' u, ] a2 I1 { ' O1 P+ H: @( x. @

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

2 C2 A$ Y' b# _6 v2 v% Q & @1 w% r2 k' z4 w, z+ N

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

! P, M% S3 e$ Q/ _+ G- R3 C( z 7 m, `2 m3 m r" q
3 j! p3 M( Y: c* @* c: q, N
3 `. K; B( Q. A/ a3 ^2 B2 L
4 D+ @2 c5 u& ]: H* l* e) N' v ) }- A$ H* v5 T& w9 Q 8 D* q5 k8 i9 R! ]# i- n$ E/ [* J4 n2 ?- K : Q/ [2 P9 [) e" I
回复

举报 使用道具

相关帖子

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