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

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

[复制链接]
4 O7 M- U+ [$ L+ a3 ?! c3 V
$ e$ X2 |. W9 h( s5 e5 f- v
2 M6 W. i4 l4 [* ]2 k
% z& D: J2 r* v$ }$ X. g9 |, M

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

0 j9 K: B! {. H3 P, m

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

* [$ ^5 \$ ]. D: C' a

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

: o* j) H, j! k2 `2 [

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

. z1 b/ z6 P% Q/ Z

import numpy as np

4 t) W8 }/ Q( ~: w+ b- c, n

import matplotlib.pyplot as plt

) N7 N2 C, r7 I$ h: v) }7 F

# 创建随机数

: v- g2 e: }) c8 k+ } d

n = 100000

; |7 L) _( B: z1 C* ^' O2 R% H; h

x = np.random.randn(n)

" J/ |0 I6 G" n3 i/ ~

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

_- A: Z2 m+ x' B4 y

fig1 = plt.figure()

9 Y8 C' [% x' C4 j

plt.plot(x,y,.r)

j* \ O g* c t, z" G8 S% f

plt.xlabel(x)

0 G( Q. b" k! v- {

plt.ylabel(y)

- H6 O# v& P' h2 H+ Q

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

" z$ t9 d3 e( N; g3 L

nbins = 200

" j$ {/ H6 M9 `4 g

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

# K3 m% L7 I* |; S

# H needs to be rotated and flipped

5 O b, ^) f; W, H+ X9 e

H = np.rot90(H)

( A! H% T$ F/ N* F1 V

H = np.flipud(H)

$ A) ?& _5 o1 g3 l; E* y& g& m# A

# 将zeros mask

3 l3 T, C; d9 I4 P: q: G

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

2 O9 d* D+ Z# O9 [* G

# Plot 2D histogram using pcolor

& X7 o0 u% o- D3 a7 H- b( b9 A

fig2 = plt.figure()

* B% i8 e# K- g3 v* p

plt.pcolormesh(xedges,yedges,Hmasked)

& h6 M4 ]: r; J: T

plt.xlabel(x)

' b1 ]! L- {1 i6 m

plt.ylabel(y)

8 O3 A% L2 b# S

cbar = plt.colorbar()

% S, _4 r& t) m# l/ u5 q

cbar.ax.set_ylabel(Counts)

3 _4 x/ B5 R0 l% |: d/ z

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

& H( @6 y% R6 Y4 v

plt.show()

) `/ |. d$ w6 R
G" a5 M" G% C n
" P8 I9 Z1 |- h$ v4 A. [
打开凤凰新闻,查看更多高清图片
; k! w2 K$ _, d4 _
8 P8 t+ P) U1 @1 W1 v4 A
. u+ u# t- t6 g5 \. a; Y3 t0 R7 r

* _9 S7 \9 e4 X3 W8 m3 K

Example 2 :双Y轴(Python)

" f C, {8 O z0 n, J" O( p6 O+ @

import csv

( Z. m5 o& I8 h/ u S

import pandas as pd

, }8 Z' k+ g+ `9 {

import matplotlib.pyplot as plt

9 B: [0 L2 i$ I. y

from datetime import datetime

% x2 |; D0 v }: z: R2 @

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

& _% n6 m u& {& g5 A2 y' n5 O

time=data[date [AST]]

7 c) a1 P, U% h2 \+ x

sal=data[salinity]

8 o) [4 q1 `" b' j7 k. `, Z

tem=data[temperature [C]]

g0 x% D6 e; d. \* k- z

print(sal)

5 w$ d. I9 k2 v& P% _

DAT = []

5 t7 e1 I- V" f, n3 S V

for row in time:

- D, U7 F- y; H: Y2 v& T

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

( V* ^0 O4 u! x! O4 f6 d

#create figure

/ x8 i7 p0 f* a

fig, ax =plt.subplots(1)

2 y+ d! O2 O( C0 |2 _

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

% N% ], T; ~% ?* F, m2 X5 c' h

plt.xlabel("Date [AST]")

2 C( `% O. M y. d/ G

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

0 k. B6 |& q" Y: o& x+ n9 E+ W

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

4 ]* H( Z) r% q, e

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

3 p- B+ b9 `6 s! W* D3 B. s$ I% @

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

$ l$ O* N* Q( V) ~7 m, i

fig.autofmt_xdate(rotation=50)

" F; o6 _) x2 E) {$ K

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

0 B( u, i* s: d! A6 j) J

plt.twinx()

+ B; p& q( q% H& k7 h; @

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

: H! N4 u- x; y( O$ h) B. F

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

0 [/ U4 H' h3 r( m

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

3 S- B! b$ e) L; P; B6 U

#To save your graph

- F1 C7 u8 q) f

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

& D7 k! U: e3 s& j+ n

plt.show()

8 [: m' O3 w, W/ |% }& T+ ]3 b

) {& T# `: W1 d

Example 3:拟合曲线(Python)

& r) Q0 |7 l0 ]

import csv

: z) R, N1 U, h7 @9 m8 ?

import numpy as np

0 l, q# p! f" t+ c A2 N, }% F

import pandas as pd

) l7 q J8 M3 H

from datetime import datetime

- `0 ~) c9 R# W

import matplotlib.pyplot as plt

) K" P. t; X s& K" Q/ T2 M

import scipy.signal as signal

, t* d- a! n2 M$ y% E" P. o

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

- y# f+ `; p2 m- \9 ? ^& q

time=data[date [AST]]

. ?9 H5 A* C* O' R; b4 K# Y9 v

temp=data[temperature [C]]

1 b" a: \1 g# y4 g: C0 p, X

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

1 p0 L* H) c: A I

DATE,decday = [],[]

& z9 ?: s! B- V y; h

for row in time:

9 N, V7 t/ O# G2 q5 z( z$ |

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

/ D( G3 V b. d

DATE.append(daterow)

9 m# R6 p8 j) V' X; ^, A

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

: g% o# ~: p3 e

# First, design the Buterworth filter

0 \( K# h0 G1 g2 {* E# n$ Q

N = 2 # Filter order

( ?7 o' [$ c! F( m4 g, S

Wn = 0.01 # Cutoff frequency

% r% e1 N, P8 s( S* ?; M

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

* Y: T4 r4 N3 ?, F! |) R2 c* Z

# Second, apply the filter

$ V' L' C1 N+ X# k+ S9 O- p+ O

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

% J4 C/ F( z. D: j

# Make plots

: Q- C n1 d W R

fig = plt.figure()

l7 h" F N' m. j4 @

ax1 = fig.add_subplot(211)

0 y) `; p, a9 R5 |' J# \# ?

plt.plot(decday,temp, b-)

" i/ p' z/ a0 S' ]; z* B, b

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

0 C0 \+ p6 i r) A! d

plt.ylabel("Temperature (oC)")

* |, P4 r# V4 N1 m; i

plt.legend([Original,Filtered])

1 T) D3 `$ Q: A8 c

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

7 m" n6 ~$ s8 w0 V+ v/ F

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

! j" W- [! k. }: F$ Y

ax1 = fig.add_subplot(212)

+ F ^6 t* v% k- G7 q6 K

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

5 r% a( p5 O2 R! r) Y/ H. K

plt.ylabel("Temperature (oC)")

2 h/ b2 r" n; k" ]# ~

plt.xlabel("Date")

- C; b k& ~4 y' C, Z

plt.legend([Residuals])

4 q z$ n6 ~5 |) V9 u

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

5 Q* S9 s6 ^" s2 B$ [0 N1 ?

plt.show()

$ m' a- v. Z* h9 D, ~ t$ q

9 C1 _/ X1 Y6 T" U7 b+ J

Example 4:三维地形(Python)

y: _- \: d3 f q/ I) S, m

# This import registers the 3D projection

& L% I8 i0 J3 I, \

from mpl_toolkits.mplot3d import Axes3D

5 B. t1 F& {" g5 `% Q- s

from matplotlib import cbook

2 Z- F" W' B; b# N

from matplotlib import cm

2 N2 w4 b0 F9 i4 r- K7 G- f/ S

from matplotlib.colors import LightSource

# y! V# X2 {3 q5 ?

import matplotlib.pyplot as plt

4 H+ u, C6 h& k; E- v

import numpy as np

( u/ g% Q/ q% B

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

% T8 t( {( h h1 \& Q8 h

with np.load(filename) as dem:

( H& c: G+ W# g- q; U% g% |

z = dem[elevation]

* n( B% w2 @. ?6 R5 V9 l$ c

nrows, ncols = z.shape

+ a7 s1 j; P6 S% @

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

, k* |4 ]; M! _0 R! ^5 `

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

/ M, S: w0 K" H/ e3 e

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

9 s5 w7 @2 }0 \: f& y; x3 {- t1 `

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

" O8 b4 E3 r, S# J

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

" U4 ~( R% j. K8 |

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

( L/ W* C* k( d! S

ls = LightSource(270, 45)

+ h, a9 G1 P. `: k& n9 G

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

$ a5 N* @- S+ r; L

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

8 Q1 E# B# V4 E( S' T

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

$ \ j9 }0 [- ~+ O( c

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

1 m* T% G$ N% j

plt.show()

; d# j/ j0 | p) Z # R! ~5 V: s7 K" H1 z, c( `0 _

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

4 v. \! p1 i. I/ x" I * J/ `+ `6 D1 f1 \( f- K

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

: c. s3 K3 Y; J; _ " E, I7 x8 Q+ I( _% C( }$ f

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

& b/ z; Z0 v1 ?/ V+ v5 ?1 } % j: G1 i! e; N: e* v

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

+ |9 i$ h8 I& a ' `% }2 Z$ ?; J+ u+ w+ Q

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

; ^) r2 V+ E0 T( N, V# t 2 j0 x& c% r- V0 n/ b
5 E! F/ W a' k$ m$ K
- b) o5 {6 V/ |) F
6 P8 r! W) d" D2 l/ G0 n; K2 m # n& D) K6 ]/ Y* M* l6 y% l3 O 0 w1 X5 \# Y6 c. ] 4 J; e# n2 y7 I5 p8 @ N' z, s6 u- Y+ u4 G* n
回复

举报 使用道具

相关帖子

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