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

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

[复制链接]
& u: u2 y* |7 Q$ `! G2 O6 P3 O, f9 F
) d9 S+ p0 N9 D) t. I9 \
" E, b; g7 U8 Z& G I, s' d
$ U* \1 I: u- m6 b) P

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

/ b9 f" |* b" \; o; h; J; y$ Z) M, U5 j

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

7 d* S* y/ r# M/ D. G) b

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

& B, p% z' [9 J

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

- w! [( @! Y/ ~

import numpy as np

8 V+ v6 v3 u% e3 @6 O6 m' Z5 d

import matplotlib.pyplot as plt

: f" a$ g j) w+ N( R. e

# 创建随机数

/ B1 F3 w- g6 f. q; T8 f( j, C

n = 100000

- w7 K! B2 z. N# d: j& i

x = np.random.randn(n)

6 t! r1 K" g& `. U. J8 V

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

7 ~9 U7 ~- \0 b2 T, ?; o6 {' A

fig1 = plt.figure()

7 g0 {4 l: B' x, u! Y

plt.plot(x,y,.r)

/ o) x* ^. U( B$ _, q! c

plt.xlabel(x)

8 j: V+ ?# l/ f+ c

plt.ylabel(y)

' \- C- i9 D! j, u4 A- H

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

" a. |5 k4 \! d" M5 ~; V

nbins = 200

. A) B. N8 ^ k$ p: r8 `

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

# W6 A& D) ~+ M `9 i

# H needs to be rotated and flipped

7 ?% I! s) v- A

H = np.rot90(H)

5 U5 z; O( y+ b, ^2 m9 W. y8 H8 d

H = np.flipud(H)

6 k, \5 }/ p( a; A& N9 }) L

# 将zeros mask

$ m F1 c+ `, |/ }

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

- ]( B6 x9 p1 Z t# f0 `

# Plot 2D histogram using pcolor

" v, h; V9 g' N+ T9 s4 d

fig2 = plt.figure()

/ e# O" W n$ y

plt.pcolormesh(xedges,yedges,Hmasked)

! P: {/ ], Y4 I. s( t

plt.xlabel(x)

: u1 V0 C8 h1 o1 v/ t0 h; J

plt.ylabel(y)

- [1 t( x, ?& H" m# S( a+ [

cbar = plt.colorbar()

3 X: k& x- M% \; n2 Q

cbar.ax.set_ylabel(Counts)

1 Y! b& x* z/ J- B

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

/ j3 @5 d3 p! K! ~* U/ _

plt.show()

: N- @$ T1 l, Z9 E
# K8 p! ~. }, C/ p) a
: N) |) N$ f6 O ^
打开凤凰新闻,查看更多高清图片
" g" T% N4 ^9 |+ J) L" X+ T3 O3 P- t2 v
4 g2 x2 V! ?& D
7 {2 \ c7 U! M1 Q

* m" M8 ]6 ^# Y; f5 V; X, U

Example 2 :双Y轴(Python)

% U+ c$ H# Z6 Z9 V) c/ Q

import csv

. A6 m6 q$ n" g

import pandas as pd

* ~7 W% ]: Q s# B

import matplotlib.pyplot as plt

7 Q2 O5 L+ E* ^0 [; P% m! D2 X

from datetime import datetime

|/ }6 {3 H4 B) I q% ~- \

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

7 G) f% i: M8 h' D, ]. y- f; T

time=data[date [AST]]

1 ]. U: @ ~, ^; m) D

sal=data[salinity]

2 R Q0 E M9 M2 m

tem=data[temperature [C]]

- Y3 f* j; D/ l+ _

print(sal)

: g, {; \; D! Q: v: D

DAT = []

. r2 i1 h6 @- T. {. E/ c6 u

for row in time:

1 @( v% _; I3 v- N- r/ h w7 M8 A7 R

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

' Q9 W( n/ Q+ v3 z) j( Z

#create figure

( Y; r% p$ N' r9 [6 |

fig, ax =plt.subplots(1)

: ~+ m# D+ U5 l1 W5 u# \" D

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

6 ?, ~- r, B7 B: i5 A; L

plt.xlabel("Date [AST]")

* I) A7 v% Q/ S" \1 g7 ]

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

& p8 F4 x2 |' P% r; G+ ~0 s5 v7 w+ R

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

! c f% c, k1 t3 r1 S" F9 T

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

9 d! ?) K/ X) z

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

: s6 I% v- P4 g6 f5 W- v5 }% S

fig.autofmt_xdate(rotation=50)

& |2 ?4 \1 w0 a" p

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

6 Y/ G, d, j/ l8 `

plt.twinx()

- M( ^. X: z- s9 ^( ^

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

; o2 j( ]2 t7 |" E* R5 K+ B# {3 h% f

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

7 k# @4 L0 H. E

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

3 {& i/ ^8 I) W( B0 O. Y( Q# P

#To save your graph

9 u4 ?/ A4 H/ q4 C! }3 s' |

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

( S, P+ S) C3 A5 V7 I

plt.show()

. C, k; h t4 I( x3 f. E

( J# u- e8 l9 K) y$ c" n: o6 R- q3 v

Example 3:拟合曲线(Python)

K* x/ K1 N) F- u* g5 m

import csv

' c' R5 b; L8 F- q% ]* }2 S, N5 Z

import numpy as np

/ H' e2 ]4 Z$ b: }$ z& t

import pandas as pd

' D9 p+ E+ w0 N, c

from datetime import datetime

0 E# O: J9 ~3 X- O; ~# H

import matplotlib.pyplot as plt

0 X8 y: Y: {0 a) O

import scipy.signal as signal

, X. b' Q0 \5 b8 d+ N+ u" p

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

' q! J+ D8 B' u2 |7 S7 ^

time=data[date [AST]]

% F- c( M; r% u+ ?( [, j

temp=data[temperature [C]]

: k7 |; C- ]* y2 ?% X

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

1 M0 y" r4 j) S, s( [" P/ U

DATE,decday = [],[]

, y. u: h- u, } l2 N3 q

for row in time:

3 C$ }! V8 @3 H& ^* _& q8 j) \

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

0 C& F. ]: m* c' X% u. n

DATE.append(daterow)

! N- v/ i- R5 h

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

& r4 q/ g' d/ J

# First, design the Buterworth filter

" f& m7 e5 `2 O. n5 u

N = 2 # Filter order

4 W! y4 {( p% q; H

Wn = 0.01 # Cutoff frequency

- [, \( M& {" B9 U

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

# X! Z) o, J7 ?7 P9 ^0 T! b8 M

# Second, apply the filter

, C6 \3 t; B+ k0 U" L

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

4 v0 X3 J N! k

# Make plots

0 {; u! C( E! W

fig = plt.figure()

0 w4 ]! k" t) [

ax1 = fig.add_subplot(211)

' Q- u# Y2 j8 z* g* o/ |) v

plt.plot(decday,temp, b-)

) ?+ N+ `8 }* m7 }" o

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

3 P' N: [' L0 {/ j% `8 S0 K! |

plt.ylabel("Temperature (oC)")

) F* Z& g2 `2 @. n. ^

plt.legend([Original,Filtered])

4 n( K" g1 x. |7 ~0 s- `! A

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

6 P1 K7 h+ N! ^* K

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

& ~, r7 V& M* H2 @$ H

ax1 = fig.add_subplot(212)

! E* [7 M, p0 O9 f4 ^ V( T

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

5 W, }3 Q. o$ u& P6 W, @, Z

plt.ylabel("Temperature (oC)")

% V( a& k8 `3 i5 ~

plt.xlabel("Date")

; `# d" W `" M4 H

plt.legend([Residuals])

0 O, ~3 ]* e2 a% y" I) F! x

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

; H( C% m# V2 o! [. u" A8 m( t1 `' D

plt.show()

+ y; ^2 c. }; I$ p) e) r- m( U' s

0 G. ^ o' Z; a# \) q F/ ]

Example 4:三维地形(Python)

$ E* o( O J6 }: [

# This import registers the 3D projection

( A- }! v1 m4 S6 n& `* Y6 s% W. p

from mpl_toolkits.mplot3d import Axes3D

0 q' x+ F: M) d$ A% b

from matplotlib import cbook

4 U/ L- _. ~. G, m

from matplotlib import cm

* p! C+ t0 {$ q$ q1 `8 `+ V

from matplotlib.colors import LightSource

6 X7 D9 H) R. t: b; d9 ?7 o

import matplotlib.pyplot as plt

( N& d2 R {0 w8 h, a7 F& g/ W

import numpy as np

; g- ^# c; \! r9 w* j5 j

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

1 @* C( y5 {; r. L5 a; I0 V

with np.load(filename) as dem:

% M: B( Z: A' M7 M" p

z = dem[elevation]

" g% O* e Z% J) g H, m0 j

nrows, ncols = z.shape

4 z: F7 k7 C: ?, [

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

8 I1 |+ x. V" D3 ^, D' L$ K$ F

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

" [) x. n8 C( A! a$ L, W6 R5 Q

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

8 {1 O* h' v5 Q& \( k* B& @

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

3 g3 {3 S; t/ T" [# Z+ k% T4 O9 v

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

" H0 _1 i' @$ c

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

3 W# Z8 o1 B' J/ V+ \8 E% B

ls = LightSource(270, 45)

1 c( H7 D0 v9 f3 Q3 f) z

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

5 s* t; |& U' W8 z/ ]

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

* S* H+ [# @ h F) O0 A

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

% ^8 A3 U+ ?' S7 E0 H; i3 m

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

, S7 p8 B1 j' s% u, Z* m1 c9 ~

plt.show()

) w H! K9 L( ]4 S! g) [! { 9 L2 j8 E: @1 M) e

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

7 S3 n: W J# u& {# h 1 w* t1 j0 P; Y

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

. e' M: f% z Q2 i$ c+ r# P ; v P7 o I3 K

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

1 _' \3 }" k d- s' v 0 G! q5 t9 \( `, E2 ]) k

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

, E* g. P Y) s+ G0 M % X! c7 ?7 \1 r4 ?' U3 F

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

$ ?+ |6 y0 F6 ^& P9 r* ?2 M ! x* J) V4 p2 S; H0 ^
2 x8 n2 y# b0 I q6 g& i
2 Y& C- W. d9 U! D, `. x
4 M7 f2 g- U& z' K8 Z3 b/ J1 H* i" t" l1 a6 p+ @ . [9 O( U6 Z: u& w$ u+ `; E4 y / O7 u4 a' g* s; U$ R- z/ M ' L4 Q9 F; n6 K( g" h* L G
回复

举报 使用道具

相关帖子

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