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

[复制链接]
0 n" p$ s+ j& H8 b4 B. `8 @2 @
' V: I, S9 T( u6 z/ H- y& _0 ~: i% H
2 F2 e- w& m8 e; t5 a$ h6 v
0 T1 W0 ?) i& V0 `$ j! e. U

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

2 k$ @3 Z7 g! \( o% E" r

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

R* v$ J# [5 J1 ~# Q0 h7 w; Y: J

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

! ]5 Z o9 ?( s

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

: q- o, G! O. ]6 P

import numpy as np

4 M% |& y% M+ \% P+ O% z

import matplotlib.pyplot as plt

# V. H9 A" @+ p& Q z0 L* k* D; P

# 创建随机数

0 ~ H- t E1 k$ k7 T4 x/ V

n = 100000

' g' A7 C' h" u# t U% C1 G" Q/ I

x = np.random.randn(n)

- j" |6 @' L% z' M6 m

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

, {) h" S3 Z6 }1 q1 Q6 q- k6 j

fig1 = plt.figure()

( t9 `, i" k# P9 L

plt.plot(x,y,.r)

/ }% P2 a* n! h9 D0 a& t3 z

plt.xlabel(x)

8 P. Q/ b4 {4 _, a& b. z

plt.ylabel(y)

+ f% T9 n, R: O4 ?3 x! `

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

! G" X+ } x" S3 R% u& A1 I

nbins = 200

" w/ M! \. O% W2 i" ^& I6 w" ^1 y

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

) d" r, F' g4 p" Z0 ~, ~$ a

# H needs to be rotated and flipped

- d' H3 i, B* v- _' n2 R

H = np.rot90(H)

) u1 [$ x. f. i, M$ s3 A

H = np.flipud(H)

7 A6 ]2 c L8 Y) e$ `, I4 ?

# 将zeros mask

; ^9 J8 S7 k5 G) {0 v9 g8 n( I" t

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

, p# O; X4 l5 e f& t2 g

# Plot 2D histogram using pcolor

) t+ m Q, s: a5 a: i* y* ^# o

fig2 = plt.figure()

2 E6 X9 F$ z! B# L/ q" d

plt.pcolormesh(xedges,yedges,Hmasked)

8 v% s4 E( {6 C: P% o

plt.xlabel(x)

3 }# N- G; N0 A9 O$ }; _( J/ P! y

plt.ylabel(y)

8 N' b& r+ q. _- E" w+ M. u$ y1 M. X2 R

cbar = plt.colorbar()

) ]" r3 W" f! `5 A ]

cbar.ax.set_ylabel(Counts)

. t% @4 d. }4 o Y

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

, T+ i; v" j: S

plt.show()

2 W% q% ~! C3 z/ F
) F/ Y3 y( B$ j; d8 S
% i, @9 ~ C( m6 Q8 W0 S& @
打开凤凰新闻,查看更多高清图片
- J8 E% B R" S
& K/ R. R" R# H
5 H. Q$ ]3 T" U7 {2 ~ A1 ]( {

) R6 T9 c* K$ [, y" u! _1 T* h4 C

Example 2 :双Y轴(Python)

+ y4 _( [5 X+ D4 j3 R

import csv

* }5 K _7 \, b4 \2 Z+ X ~* H% H

import pandas as pd

! O) d% }1 a% x" o2 [2 C( g$ ^

import matplotlib.pyplot as plt

' k- f( U+ K8 _5 x+ ]+ @

from datetime import datetime

, v; `, {" Z. k% z

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

: w8 t- t* F0 L3 h- F

time=data[date [AST]]

' s6 p' S3 {' V5 O- b& z

sal=data[salinity]

j$ P9 v" K# e; |) l) l% w

tem=data[temperature [C]]

% }% W' a: N$ [ a# H

print(sal)

2 J) I; T- z2 Y/ v2 `

DAT = []

- Z" `; l( P& h5 W" g

for row in time:

7 ~* _6 N# d: `& @- D0 O$ f

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

& k; D- p$ E8 q! m6 j' o/ h

#create figure

3 U8 H' s$ B6 }

fig, ax =plt.subplots(1)

+ o! G6 l9 E S

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

. A; _& ~6 s2 o+ y2 y

plt.xlabel("Date [AST]")

, P. u8 H2 m- S+ b

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

' J2 \9 O9 C m4 Y+ U) E6 O# w! B

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

8 Z# y& o# C1 ~

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

* `9 r* D' v" H+ |% `2 {0 h; U4 c

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

' w, _, k$ [# ^# }

fig.autofmt_xdate(rotation=50)

3 Y" B2 w$ n2 j% U. e

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

3 N9 Y! \* H H3 A# G; L

plt.twinx()

$ |- Q: ] y) ]! G0 o6 u

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

% e* A, }( X s7 E+ A2 V

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

3 G/ [+ c( \# F0 e( \4 E6 c! S

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

: @2 n( ?0 `2 j' A

#To save your graph

! e) r( J5 F6 e# w* ?, l5 |

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

2 e+ G' `7 [" e! S' Z" r) G

plt.show()

4 C1 h, y1 O4 v% P& W6 e( Q

' S6 x& K- S4 V+ M1 w

Example 3:拟合曲线(Python)

/ N4 O: i# i4 c9 G5 T2 }4 P

import csv

) `6 k5 ]# x% g- N! G2 @( s

import numpy as np

* e8 d9 c) x9 r" B+ |4 u! w

import pandas as pd

$ S/ d c' y5 s0 S# w

from datetime import datetime

S+ U2 r- }- B7 |

import matplotlib.pyplot as plt

$ l, p3 a4 [* E' K/ ?5 f+ H3 E

import scipy.signal as signal

* P" e7 ?+ N* ?" k

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

: B# e% O9 c7 E: o [$ @" [/ Y

time=data[date [AST]]

- n$ {' j4 e, Z; o* o

temp=data[temperature [C]]

$ _- G% @3 J4 _9 i

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

: i( E( O! H; |. J

DATE,decday = [],[]

; k! U. s, _7 u1 f2 I! r: e

for row in time:

v! u* N U9 P

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

8 |% Y- p$ m) j0 `9 U

DATE.append(daterow)

8 Q6 N) S# D! i( d5 w3 a3 P6 ^

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

: G, l7 t. n3 u( p- |( X V

# First, design the Buterworth filter

# G( H! H6 T/ T: y2 F0 y8 |& t

N = 2 # Filter order

' O5 z1 ^% S6 D! A+ `3 U

Wn = 0.01 # Cutoff frequency

% i7 Y" x: X U7 H

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

# c, k1 S9 I* x7 Y4 W* v* v

# Second, apply the filter

& R. F& k8 X" C& q v+ W% q J: r

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

) o9 A( q$ Y% G2 U( h3 N g Q! C

# Make plots

$ V. F; ~( u5 I# k6 t8 H3 W& ~

fig = plt.figure()

4 x% f5 S$ K4 H) d

ax1 = fig.add_subplot(211)

. u- g' m' g+ N* ^' k

plt.plot(decday,temp, b-)

. X2 R8 _' c" Z! M

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

( j6 b( U/ w7 f2 l) @6 d2 `

plt.ylabel("Temperature (oC)")

8 ~" X# n$ j) v* W) M

plt.legend([Original,Filtered])

$ U% ~' z% [' l" p* q

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

* l; y k4 r1 P, }, f2 r! V4 Z

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

$ a8 N2 w5 L; v! T! o. Y' q

ax1 = fig.add_subplot(212)

' S) _) N" h- y4 [

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

5 W* e# _: G: O, L2 x

plt.ylabel("Temperature (oC)")

4 p1 j8 ]9 `' ~% V5 @

plt.xlabel("Date")

- }! K/ ]8 b& T5 P

plt.legend([Residuals])

3 p% c1 {$ w# e8 x4 U3 q" v$ G

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

( G4 H9 @( j1 c& K$ c

plt.show()

t3 P+ Q8 s3 Y G3 m7 K. c

# F6 N: h ~( M _; w- V; x" E8 I

Example 4:三维地形(Python)

* x/ m% _, U) Z# A) z. l3 }! k2 {# G

# This import registers the 3D projection

7 W- ]& r% Y9 w7 @0 o# b/ ^; N

from mpl_toolkits.mplot3d import Axes3D

; \' z) H; e* A% @1 {

from matplotlib import cbook

4 J1 T/ [: `# n, R3 z" V& j. t* n

from matplotlib import cm

: ~5 F+ t$ g$ T! U% L$ ` R

from matplotlib.colors import LightSource

) ?3 y; C# d5 S2 O

import matplotlib.pyplot as plt

2 Z# Y% B# O; R4 g$ P+ X% R) R

import numpy as np

' F! {, N7 g4 C- ]) E( ?/ s5 ~3 |

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

# G1 x, G3 l4 ` P3 [; q1 q

with np.load(filename) as dem:

' c4 F4 ^6 V4 a1 k

z = dem[elevation]

2 w/ {$ g+ o' N5 e% X+ `: F

nrows, ncols = z.shape

7 Y& L9 d+ E# F

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

# P6 i$ W0 q1 ^6 b$ Y" {, P5 [5 K

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

+ U" N9 W" f6 [# l

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

9 N6 T1 d9 \8 i, @

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

# ^( P* C& f( x" p' V L

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

, _. ^- r2 t, o5 u; H/ J$ F

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

2 v |7 h+ }4 ]7 X8 p

ls = LightSource(270, 45)

: G: ^: c- L/ a( u% h0 w

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

' O7 \& M7 O6 t: {# }

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

) t' z1 S$ a' X4 b- }, z

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

% Q: b; z! m6 T2 m4 o

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

6 n( j% v* J: Y2 w* Z( |

plt.show()

: q& _7 M2 Q/ M2 E7 } " K1 c; \7 w+ }+ I' E

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

+ |* q3 s. U$ y& v) w# |" O 0 o8 ~! x# p, u# ]) _) P" N+ P

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

- o5 u6 l8 V8 {, z2 U 6 ^# H' B( b S1 d9 |2 J

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

. R7 A! s4 H" E6 G. z7 J ( i. \1 S9 m' p) q# j' u

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

7 s9 o; `; G3 i + v; ~, O4 q& P, B9 G

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

- H; N4 P, P0 g# Z" O7 l+ @3 L : |0 W) U8 r6 W3 H. v
4 m9 V$ }+ V& h) I0 [: K _2 t
8 R/ S. r' n/ `3 C; o# L, b7 E
' C' Z$ m/ M0 \: X - J0 M7 X$ b: B8 Y* w- t" v+ q% `3 L Q1 c0 j5 y 7 a; _6 p3 R1 L1 c! a 8 s/ Q1 k, O5 L

相关帖子

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