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

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

[复制链接]
- w( @& ]1 X. _) c8 N2 ^
, q+ r7 B5 g# ?9 f7 {3 ?: v0 m
9 s, a0 `5 u/ G5 }& Y7 ~& g
8 t4 p. W. z$ {

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

# |( [+ P9 h8 x* O0 w

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

" E$ z$ k& [4 w4 g

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

# N1 w- B4 z& k+ K% Q

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

1 ?2 @" E$ T# Z) L, G7 q# q( `

import numpy as np

0 Q( v* n: d: I+ X

import matplotlib.pyplot as plt

: X2 ]0 [8 O2 Z/ [% q* I3 |

# 创建随机数

5 h. U6 u& k! ~# a5 k9 e9 ?

n = 100000

1 v+ |& ]. ]6 E5 V ?

x = np.random.randn(n)

0 D9 x, H( ~- ^0 q) f

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

& L# R+ a6 ~ L7 Q+ A

fig1 = plt.figure()

; \2 @2 g) L6 e% _' T4 f5 ?* Y% ]& P

plt.plot(x,y,.r)

7 z2 j9 Z7 E& J6 {, G/ c1 m8 y {

plt.xlabel(x)

2 Q, p) m5 x; V' F1 o: Q

plt.ylabel(y)

8 }$ h5 ~% S0 T% z. a

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

$ y; W/ M% S: Q4 P

nbins = 200

, z7 ?4 W3 ^" `$ ]0 e. r* f; X+ G

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

- _' v: }% H# M' T; v$ U9 I a+ d

# H needs to be rotated and flipped

0 K* p' @8 _3 d% ]

H = np.rot90(H)

& F4 X! k8 b' f: r7 W/ q

H = np.flipud(H)

, _3 b* j8 c, k( x; s

# 将zeros mask

: P% p) h; |4 z$ a. ~

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

7 m3 x' k2 V6 e( X

# Plot 2D histogram using pcolor

. q7 D# g( f6 f" Q& Z

fig2 = plt.figure()

5 b; o8 f0 D+ y4 b& u9 a( C6 h

plt.pcolormesh(xedges,yedges,Hmasked)

& B! L' N! H5 i+ ~3 K

plt.xlabel(x)

- [+ T* L* O! ?" w& f9 l

plt.ylabel(y)

0 g3 G# j1 ~: J0 r9 i* g0 B5 T

cbar = plt.colorbar()

) q- n% e! j: S% R1 q" e

cbar.ax.set_ylabel(Counts)

3 y- D+ v L1 O5 J9 C- G, _

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

0 l6 t" e0 E0 b" e9 k+ C

plt.show()

- t& s7 i) R8 ~! @
" j9 g+ k9 ~: \% X
0 z) [+ `3 \8 \4 R5 P7 B
打开凤凰新闻,查看更多高清图片
2 {1 w& `, e( S! V0 Y
' Q9 m. L) v4 ~- H" m* F
0 n$ b8 N8 w T2 P, h" a9 m! L" _8 @

* p: u2 [# U' S% M9 Y

Example 2 :双Y轴(Python)

) f S Q) C" o: i! l

import csv

7 |7 n1 x6 T$ t3 q

import pandas as pd

( z# P+ E3 C c% X u7 @3 z

import matplotlib.pyplot as plt

0 L2 g) B6 g. J

from datetime import datetime

5 S1 c) l2 p3 N" ?3 [. |. z5 t6 E

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

+ Y' j8 H. F7 i' ~3 r) E

time=data[date [AST]]

& F( `8 D. _+ L% i; ]1 L

sal=data[salinity]

' ^7 h. W& N6 J6 C" H

tem=data[temperature [C]]

# i* o9 ?, w( d7 l0 l

print(sal)

) y+ t0 L2 t& X

DAT = []

$ m$ J" X# G/ G, G+ b0 t9 S

for row in time:

; X) a* W% l5 @

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

; ]1 y8 u: N* k( m

#create figure

" Q; M5 o3 q; X& g0 N8 X

fig, ax =plt.subplots(1)

5 i) S* N% G% y3 E

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

$ _( I! x$ @5 @- f

plt.xlabel("Date [AST]")

9 ~; p& d1 x: \4 T: k K

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

, L0 z! ?' ^5 v) h' f/ @

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

2 [5 k/ C6 E l/ t I6 N! h

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

' I: f* L! F6 A& `$ A

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

; }' H; G3 m* R6 l' u$ `

fig.autofmt_xdate(rotation=50)

9 B M8 z l' L6 d, E* Q& _

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

4 S& S! K4 v8 G* @! t( V

plt.twinx()

: x/ y1 O' B: J4 M

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

B- k) Y# G e U8 p8 {

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

- t- F# q* G5 v. W1 U4 }% r" s3 t3 r

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

8 u0 ?/ V' [/ C* L+ S+ X, M: K S

#To save your graph

* k' j1 o# S2 z4 k6 v1 h

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

/ k. _7 _3 X0 d1 o$ h

plt.show()

) h* ^2 X& d9 F" W6 z. S; [* n

* Q; Q3 ?8 b2 i7 C' P

Example 3:拟合曲线(Python)

" {- Y5 m' z: B5 z/ w7 e% _

import csv

' U( c0 j h3 ?' l) r

import numpy as np

2 f% |4 ^0 B# K! A% J+ W% g7 Y4 K

import pandas as pd

& |' J1 U7 [! X- Y: u. I8 c ^

from datetime import datetime

0 e% P7 |5 }$ ]4 v

import matplotlib.pyplot as plt

- O* h0 F, t: n6 s& q9 X ?

import scipy.signal as signal

. e+ d$ s5 _) A

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

8 S4 y' D% j' K% d3 w

time=data[date [AST]]

8 y! C# X# B5 k$ x" ]0 x

temp=data[temperature [C]]

3 p( T2 }/ {8 Y1 m7 l, T4 D

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

; _/ k H0 N" B

DATE,decday = [],[]

1 e/ d7 C/ M. r2 N

for row in time:

6 l" k* K0 C/ `6 v: Q

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

! b4 S7 V' M) g; g) M3 o

DATE.append(daterow)

4 w( } M0 r5 G0 j

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

0 D/ v" K& G l6 P- p. j: [

# First, design the Buterworth filter

: d' R" h1 g9 O' k7 q( }1 U

N = 2 # Filter order

: Z/ R1 X) [9 N+ H( P

Wn = 0.01 # Cutoff frequency

7 W) z8 P+ p5 e; Q

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

" s1 F2 k$ C# g* f# S% s* A

# Second, apply the filter

4 f6 \9 }3 y8 q: Q: f, O

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

* X9 J8 u8 G: _0 A) ^

# Make plots

5 ~) b6 {7 [3 w' q3 `8 R/ E: Q

fig = plt.figure()

9 i3 I c0 }* l! \% B

ax1 = fig.add_subplot(211)

! k# l. |, a& }: X! P% @" o( u

plt.plot(decday,temp, b-)

$ |1 @" ] M# q1 D$ ]

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

9 W% B9 u& @# ^+ L. r' n a. X( N

plt.ylabel("Temperature (oC)")

, x" m% u: D1 R) c1 ~3 \, j0 k

plt.legend([Original,Filtered])

1 X- v1 L. @- r( C

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

9 Q1 W* t0 k( e# y9 p9 E% O+ v

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

$ J0 ?$ g) q3 K/ Y& e

ax1 = fig.add_subplot(212)

2 u+ o" w: T# L1 @& t

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

4 ~* a# | W2 B' L$ D0 a9 e

plt.ylabel("Temperature (oC)")

3 h" [, {$ z; s0 r. k$ d9 ~$ L

plt.xlabel("Date")

1 L6 s+ T/ `- r, b! k# {

plt.legend([Residuals])

. f8 A& z! O! w) F" O

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

/ I; e1 F8 z/ A0 L L& [5 D

plt.show()

2 P6 u. o* g3 c! g5 E1 N9 w7 `! X

7 S) }. `, J" ^9 o g" x, W

Example 4:三维地形(Python)

8 j2 _; m- X( x% S" X& t

# This import registers the 3D projection

% u5 y3 P/ A' f K2 A, P/ l6 r; C

from mpl_toolkits.mplot3d import Axes3D

2 X6 Y" L$ D1 }- X! k- B; P: D

from matplotlib import cbook

! N( T8 N1 ^# {4 J4 b

from matplotlib import cm

& W* z [. ?- {" F$ }! Z1 E

from matplotlib.colors import LightSource

1 F, u9 ?$ j e& \ v; k9 V6 f( c! E

import matplotlib.pyplot as plt

7 t4 Z$ E3 }! H8 [' a

import numpy as np

V ]' P( F' R

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

/ K: E3 ~: ~7 y/ I# u" S8 D

with np.load(filename) as dem:

: o: c# H) M) d- L( R% c

z = dem[elevation]

2 t* R7 L! }* {

nrows, ncols = z.shape

; N! L: @( u/ O% J. `% W

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

* v' S L Q3 y0 ?# a# b1 z, j

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

' P2 ^( q+ D7 k2 O' j7 q

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

7 \$ S5 S/ g6 d+ ]+ `

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

2 h) R! k# Q! h h: j) O, v3 ?

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

6 Z) o s0 P1 o+ W

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

7 D! G+ A% s. F( {5 l

ls = LightSource(270, 45)

6 s* `# a* I/ M: \

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

$ o' V+ T, c6 ^8 q; L" P

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

7 b$ r# v/ I0 I8 @

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

9 W: h% d8 U# n

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

. e$ N$ C/ Y, c/ {5 N7 B! K

plt.show()

7 O7 x+ {0 t+ F, v3 K 0 I- D/ }9 Q; e$ `

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

0 \ n: l# Y: w ! ~; ~$ {! T6 d( A( V- K

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

! h2 f6 h( J" k( h3 k 3 ?% H- x0 m" J6 l% `: u: p

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

; ^' d9 V/ Z$ p6 z e/ q 3 { v1 I5 ]! ~6 r

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

* D2 A3 G. Y% q% Z8 p7 A , A4 x) \" v. w5 F4 J

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

; a# I( }* m, }% o: [2 a* g5 s : u) ]3 ^: c7 a9 w
& {& p& p# U' ^
8 d2 P: }6 ?6 @7 x- L1 i
. r4 @+ B9 p+ [# q2 @ ! }% ~, L$ D4 W5 W" U0 g( P 9 G* _( o( N7 `# K4 D , [7 {; O, k& I" \7 W2 C* K $ ?) `* m4 }) U
回复

举报 使用道具

相关帖子

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