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

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

[复制链接]
) z* J( r4 p5 R c8 S+ O( P% ?
4 v3 f' L4 L7 F& B0 `
: [ d, j/ [+ e. N" |
& z* U1 M+ D. r" @8 F

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

+ L0 \# ^, x0 Q M5 Z

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

/ h8 v* v' B' l" s" X; r+ I. o

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

. a6 _; ?- l+ D$ Z' f0 _

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

. u$ T( X9 {- V; _% T

import numpy as np

3 ]' C- [1 `* B! H* t

import matplotlib.pyplot as plt

& w6 V& n% k2 C

# 创建随机数

/ c. X, G C$ y

n = 100000

* j6 Z5 k" a7 Y; C3 ]* b+ W

x = np.random.randn(n)

2 U& B, L6 c/ m+ k/ N3 o

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

* D: r! i9 P/ y& U0 d: z

fig1 = plt.figure()

- g& Y4 t6 Y9 z$ y$ J" W7 W

plt.plot(x,y,.r)

/ z0 M# i& _6 M; z { p. A$ Z! R

plt.xlabel(x)

; Q/ h$ M1 ]# H

plt.ylabel(y)

/ I% c+ W+ z" F$ [

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

. m1 |/ j# {1 w$ c6 S4 H/ T

nbins = 200

h$ ^# {3 E8 Z1 e

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

9 \8 N t& C3 r3 q+ `$ a

# H needs to be rotated and flipped

; t: e$ o/ q1 T) C, x

H = np.rot90(H)

) \0 d" ~5 N4 T4 x

H = np.flipud(H)

! V1 g. b' @: k6 \( `

# 将zeros mask

! `8 b. k0 U* k U% d" u8 t

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

' X$ p8 g2 H0 x* ]+ ~

# Plot 2D histogram using pcolor

+ X9 H- |4 [4 m

fig2 = plt.figure()

) W3 P& K, @- w* X: Z4 ^+ Z) S: o

plt.pcolormesh(xedges,yedges,Hmasked)

3 e! {+ L& z# L/ n

plt.xlabel(x)

5 P' }' I4 z( r+ `

plt.ylabel(y)

: a2 d6 V" q3 s

cbar = plt.colorbar()

0 q" V: N q% K* S+ [# ~

cbar.ax.set_ylabel(Counts)

$ k ?4 H( [0 b+ q: k# p

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

& ~' J3 i. n+ x2 u4 {' B+ V

plt.show()

6 L- P% G @/ K5 p% a
* T2 p5 T( ^, Z& Q! G8 p* S: t
6 N& w5 T7 ~+ e) k
打开凤凰新闻,查看更多高清图片
& P/ C; n1 p! | T- X
) w% ~8 R8 `/ S
( P" Y1 |& V3 o7 z2 E

( g* v, j3 T; A6 J4 r1 d2 L

Example 2 :双Y轴(Python)

. E- I( d1 I2 c6 ^2 T

import csv

/ w, C! M- z/ i8 z

import pandas as pd

4 y8 A5 M9 r' b4 X9 V

import matplotlib.pyplot as plt

3 z/ \; r, D2 A7 x! i. ?

from datetime import datetime

7 n' k' V: N: u& { R

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

4 ~ M' v) A% n# q

time=data[date [AST]]

! I, q+ S3 I. w- u

sal=data[salinity]

9 l/ \3 ^ f/ z. c

tem=data[temperature [C]]

% f& I) U/ V7 S" H/ k3 d1 Q

print(sal)

: e# T$ I0 l: T4 ?% m, b( }

DAT = []

0 f# P. r+ g2 \" a# x5 w

for row in time:

4 C8 Z, m; ]% `4 s) `! b! f+ ~$ u

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

3 k% o! a0 F& P' d. t3 s

#create figure

& u) T/ v, ]: u9 F' s

fig, ax =plt.subplots(1)

% u) L' P7 ?/ S& P6 o9 ] B

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

5 [/ c) f: R5 s/ Z9 f

plt.xlabel("Date [AST]")

5 o2 R4 H6 K2 ^7 ^) m

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

/ q- }9 l) p u5 s7 d% s2 b, V

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

" L% x" m( J4 a) _0 g; i

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

1 N8 \( ~6 B; c$ _) H8 i

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

* C% ~. }! z+ ^# ~

fig.autofmt_xdate(rotation=50)

; l1 Y0 v, N6 ?

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

$ S+ H! ~7 Y: K& i6 ]

plt.twinx()

4 `" g$ G$ F3 b: S7 Y

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

% R9 p0 x0 h$ \. M- j. {* P

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

+ n5 h) }+ }5 O8 x6 G5 a

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

9 P' F/ e3 P- l N) J

#To save your graph

4 k* I1 t( w$ I7 K- C: T* p2 E

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

& k+ G3 ~ y! o+ f: o/ c

plt.show()

% ^% V! y* t% D

0 z3 R' U `& s5 H& _) {& p

Example 3:拟合曲线(Python)

6 f/ g5 _. S; S+ t% E

import csv

7 U+ L# K b9 }4 m" O# b/ B

import numpy as np

7 f# e$ Y% j- b4 S9 N% I. J" L

import pandas as pd

7 z8 E( j* B4 @1 G- p

from datetime import datetime

( t' |7 |& Q' H0 n' X

import matplotlib.pyplot as plt

2 o0 @. C) Q% Q2 z n' w

import scipy.signal as signal

) } e* T( d- G/ m. k& f, D

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

$ H4 z: i7 N( l0 K g

time=data[date [AST]]

& R* _" l& A( P0 h4 }. `9 j: z) w

temp=data[temperature [C]]

* u% j7 ^6 Z5 n$ f& m( M* y) B" X

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

# l. Z+ ]) S: F" |+ W; a* U

DATE,decday = [],[]

+ E1 y% {/ w* \7 a6 V: I2 V

for row in time:

5 \8 d: c) Z! R1 ~ f

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

# W5 |( b* p/ e5 ]2 Z; m! q$ R

DATE.append(daterow)

, A A$ k$ s: L

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

. D9 N7 G9 R' X `4 Q- o/ P. f: m3 y

# First, design the Buterworth filter

G7 ~' ]0 `- P: ~! M& d! O4 ~

N = 2 # Filter order

: a X5 V5 I) L

Wn = 0.01 # Cutoff frequency

4 W, f2 T# B U1 P2 c( R. \

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

f4 ^% o- g! \! C

# Second, apply the filter

' b9 K( r) T: E$ Q

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

8 p& v3 B1 S. A: f" }

# Make plots

, t G$ k8 e g% A

fig = plt.figure()

/ u3 n* l, m* k: j" L

ax1 = fig.add_subplot(211)

. t4 O% e" o9 k* {! i6 Q! n

plt.plot(decday,temp, b-)

# k! T$ W }2 `9 y/ R( {- w

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

8 G4 O- X) f" ~* |1 x/ |

plt.ylabel("Temperature (oC)")

) a J' ?- b9 N

plt.legend([Original,Filtered])

( Q u& e- _- Y: k# @& ?1 }2 U

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

2 X: }1 E7 i; D7 d% e) T

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

! W& k0 U M- X8 P( i4 i! K

ax1 = fig.add_subplot(212)

( U! c! N+ m0 u

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

, G7 r6 h" t [2 X' E

plt.ylabel("Temperature (oC)")

7 g: J# m0 ?8 Y ~& ^3 {

plt.xlabel("Date")

# P5 ?! s4 p- r: p1 h' I0 d

plt.legend([Residuals])

/ C ~4 b5 _5 ]& N

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

% S. Q5 N. m& c& r/ x, g& _

plt.show()

' a! v6 @" N6 n" u3 t2 O$ h }

# x! M) O: o* x+ Z. s% i

Example 4:三维地形(Python)

$ q' K1 n: x1 ~( }

# This import registers the 3D projection

4 Q, T( }) q1 e: `. |) [6 C

from mpl_toolkits.mplot3d import Axes3D

) `% p9 P* ?$ E! Z

from matplotlib import cbook

1 S4 I7 l' U7 Z) ~& |* N, x

from matplotlib import cm

: Z, k1 @* [. M2 y/ n5 u

from matplotlib.colors import LightSource

3 G* X9 u- j( R8 n

import matplotlib.pyplot as plt

7 J0 D% t ^4 g1 F w2 Q; e

import numpy as np

$ C0 T! y) Z% f* v# E

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

/ p) G2 ?6 B8 s, b/ T6 e! i! X

with np.load(filename) as dem:

, Q5 z! A& h7 @: Y5 `, d

z = dem[elevation]

: o s1 V) y, H# j& _

nrows, ncols = z.shape

/ u4 m# V3 r) Y! }' j

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

& M% l ~' [# }& }+ H

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

/ b! [( x' h- i% Z$ u2 j

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

. I% F+ ^- c8 U4 _9 y! J, M

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

" c# r7 X1 e2 f) C6 c6 r* v

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

4 J- p8 f& Z* b

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

8 X4 |% `! ^6 ?/ ?

ls = LightSource(270, 45)

+ s6 \' Z& ? }

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

# {- B: a, L) \

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

+ S: V: w6 a* R

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

: c7 c" \3 U2 Z. X1 r6 v+ ^0 l6 s0 J

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

2 T1 p G% B5 q/ Q4 r$ h' Y$ k4 p

plt.show()

2 a" d5 K! v" s! `" {/ {5 m S ! p6 N3 K( e1 r* ~

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

- R% C# m; h. F* ^5 w: |1 u+ N& x ! ]! ?- u' h* K2 K9 d# e# ^

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

2 N; o1 u# n7 |, ?6 h: ?' Q , m( v, n6 b6 U$ W+ V( Z

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

- E$ `( r r- } " `! x% r4 `+ L2 O& x& S7 J

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

7 O- v4 R- w9 h2 o$ z . x& I( \3 m- ?$ c( D

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

7 S/ O* f& s+ ^+ E ) L V4 d7 U2 O% P, k
; f: W7 Q. M9 R" A# F- r
. t! f; `9 [ `5 L0 p- a
9 u( [1 i% i+ M) P' G R 3 B! `/ [, j0 c4 y1 B T 3 F! H {, |5 N, r* s+ y3 _ {3 [9 l' N3 Z* |' ^% |: U : I3 T. J% z4 v/ c
回复

举报 使用道具

相关帖子

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