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

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

[复制链接]
; s5 _& Q/ y! F
0 d, g! O0 k2 p& B0 A' C2 N% j+ x. W3 R
7 z' i8 B0 X2 h0 J
5 O% k$ ~& D0 s1 t( Y4 Q8 R$ h7 [0 b

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

! T- F+ K9 J1 _+ I) M% `. t: C4 p" S

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

! l. ~$ n0 X; R; z

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

. ~; w: k9 x Y6 [

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

& e8 F. f' |0 r( Y) w5 ]0 t2 i1 @& Q

import numpy as np

, O; j! t5 W6 u9 _

import matplotlib.pyplot as plt

3 N6 _! E6 T+ p3 a `+ r- K

# 创建随机数

{( z/ \ s3 G

n = 100000

. F8 j4 J) f' S% ?1 u& t( L& u, D2 K

x = np.random.randn(n)

; x& `$ l# d6 M% w

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

/ g' l- E0 B. T9 L

fig1 = plt.figure()

& w" @1 }1 N# T( T$ C

plt.plot(x,y,.r)

$ l4 @% a+ n1 ?3 N( B

plt.xlabel(x)

1 A4 V. C2 @7 v- H. c% _4 I$ `

plt.ylabel(y)

5 e0 z d+ k s5 _0 t

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

g5 n- Q7 a: X' {# d/ B1 A9 t3 D

nbins = 200

# p, c) k3 E5 v" X4 x

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

8 s0 m& b& X. g0 n" k, T/ X y

# H needs to be rotated and flipped

7 ^- l2 f; u5 V# Z

H = np.rot90(H)

& d5 I& c# _4 }

H = np.flipud(H)

7 X* s" H) U: s3 b

# 将zeros mask

~& f: X* K, x, ]

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

$ k' Z% O$ e5 e9 l X1 U0 }

# Plot 2D histogram using pcolor

+ v* A. o2 E" i( r& X- ~! [

fig2 = plt.figure()

% P+ F0 @& q+ {8 F

plt.pcolormesh(xedges,yedges,Hmasked)

4 c2 s3 v* ?% `: I* @5 U

plt.xlabel(x)

2 b; h; z9 l, [) H

plt.ylabel(y)

9 l7 `. y6 m- X+ B

cbar = plt.colorbar()

* E+ w: e/ t. C6 Q* E- R0 ?) P

cbar.ax.set_ylabel(Counts)

* [% @, U1 Z, K/ R- E1 t9 |; x

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

6 Z$ J# e! m1 k% T

plt.show()

) z) {3 O. n2 }8 U$ ^# G
1 g$ l5 x/ K8 z v# ]6 D, |
P- D; n$ H8 `+ d2 y. s. V/ [% X
打开凤凰新闻,查看更多高清图片
2 |& L, f0 a$ O; w, Z& D
' X1 @6 M1 @9 f" e
& T! u8 m' k# a3 |) X7 Q

- S+ k5 m6 o) u* w. Q

Example 2 :双Y轴(Python)

& H9 @3 S4 `* U2 E

import csv

1 G: ~0 T1 v( i

import pandas as pd

$ ^( r! [5 q! q1 S

import matplotlib.pyplot as plt

4 t: I8 Z' e( H+ o

from datetime import datetime

: ?+ t, s& u2 i4 h% {' a5 ?1 S

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

/ y- B3 U6 T( o' Y3 s/ g& W

time=data[date [AST]]

1 W% ]6 Y6 N5 J1 y/ @& d

sal=data[salinity]

7 n4 H3 C" l& V( z; B

tem=data[temperature [C]]

' b8 M `- G6 L

print(sal)

7 L4 B, L. r6 v3 Z' c A

DAT = []

& D3 d% }! e( v2 P4 @1 \/ q

for row in time:

6 }8 X. a1 Q' r( ^0 [1 S! p% F

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

: [$ ~+ k* Q' ` x; A: @9 m

#create figure

) k# l6 E8 }0 d

fig, ax =plt.subplots(1)

5 f' p9 B& \, U5 K; [1 r6 l; N

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

( x5 A. t) x8 R: a: \# x+ d

plt.xlabel("Date [AST]")

- V' m4 r( y* u2 z4 a

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

6 s: @" I- C$ _5 {1 n4 ]

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

! t" E5 H0 A0 S6 N

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

0 A. H5 v3 h) B8 X* g. N

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

D; |. H1 d# y/ t+ Q

fig.autofmt_xdate(rotation=50)

- F( ]" B; A# J. C! I5 H9 h

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

3 H6 w6 V- y8 L* m, U5 f* ]" A& \" N

plt.twinx()

+ I: P# ]- e2 J* w

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

1 H- f- p2 i& L/ g& V8 d ~

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

# O6 f' r8 P7 z& }: d0 e8 p

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

c: M& S/ i; w$ Y7 z/ Y

#To save your graph

1 R$ h# M+ d* E* b0 H

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

, c) q. _$ J( c8 T, R" e& w6 N

plt.show()

+ ~2 p. m5 T7 v. }

, C* `5 u- o. \6 C8 d3 h7 h

Example 3:拟合曲线(Python)

3 Y2 k# e) C& a9 f/ ?7 `

import csv

% d& }. y+ U$ m4 ]0 @

import numpy as np

* w6 {7 }2 r# h6 f X) J, @

import pandas as pd

! L5 c1 z, T' }* L* X+ B/ ]

from datetime import datetime

. `. v Z3 j/ h" ^4 V

import matplotlib.pyplot as plt

2 _8 H6 Z( T, w' B- n

import scipy.signal as signal

- O1 o3 O* B1 j( s, K3 M% O" H

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

( L4 w1 {' v& n) b. s; Y; N/ X

time=data[date [AST]]

7 U l% ?$ o1 h z) e q

temp=data[temperature [C]]

$ S% w& P# N, m" o

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

8 n8 z) E; F& b" \

DATE,decday = [],[]

' ~1 |- V: X5 c4 `% X

for row in time:

! S4 U3 y0 i, ]# _3 Y& {

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

6 I' A- y7 ]: x, b7 U; s) P) g

DATE.append(daterow)

4 q2 d" T% g. [1 L) ]

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

2 I- }/ `- ?/ s$ E# ~( P: |. r0 e7 Y

# First, design the Buterworth filter

# D6 R( @- D/ F

N = 2 # Filter order

: o: ~" W2 H# D* a& Z

Wn = 0.01 # Cutoff frequency

& `2 v# B- g1 L# d& ~

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

; W' Z% _5 ?9 w7 g8 q9 E

# Second, apply the filter

: x8 A$ C* y" a

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

5 j; [+ _* z" L' a# a: x

# Make plots

, h- i k+ d4 w O. O9 W$ S$ R0 E! H( O# p

fig = plt.figure()

. B$ `8 @9 |6 @9 j- X1 I* o

ax1 = fig.add_subplot(211)

& P6 Q; q( B+ e+ K/ J, Z- E

plt.plot(decday,temp, b-)

: J4 }) w, ~% {6 S/ ^' N

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

8 m5 M$ a; \$ Q; ~8 ~2 c

plt.ylabel("Temperature (oC)")

, e' {; }' L5 J

plt.legend([Original,Filtered])

, T: |1 n6 d$ O5 I& Q' s: `

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

. ^- @2 Z. D- ?( D

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

; K9 ]1 b* I$ r1 o

ax1 = fig.add_subplot(212)

7 a$ w- U, Q. r% r4 X9 u/ o, n& y, _$ a

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

8 {; l7 H6 ^3 H" }/ P

plt.ylabel("Temperature (oC)")

9 i; t4 @: p+ O

plt.xlabel("Date")

* P2 |- l0 Q1 X; a" r# ]2 G

plt.legend([Residuals])

7 d* C F9 K+ o

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

+ t" Z1 K. m7 o" C

plt.show()

/ D' [ ^3 B4 m* v

+ T6 s3 ~! [; J8 S- c5 Z% p2 t- W

Example 4:三维地形(Python)

1 \$ V @1 |/ A. I7 @0 J: h

# This import registers the 3D projection

9 Y) K; X7 c& X; S# W

from mpl_toolkits.mplot3d import Axes3D

7 W3 j' X8 p# _! R4 P% y8 |

from matplotlib import cbook

& C' v$ d8 y }; F, m+ Q% J

from matplotlib import cm

W: F& W+ ]% g$ l

from matplotlib.colors import LightSource

8 n I( I3 I/ N8 A

import matplotlib.pyplot as plt

$ W" G3 N7 g8 k' J& C

import numpy as np

2 i! p: F! F& d& D. M3 Z

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

& |8 F" r) n: y3 I1 N! v/ i' V

with np.load(filename) as dem:

. R' C# S% C7 L9 u& `+ Q9 W0 L

z = dem[elevation]

8 s/ `! K2 y. u# M0 }

nrows, ncols = z.shape

8 a t2 q& T6 `: { b

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

9 W" x& Y" c+ S+ _

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

9 l0 N. y4 W& Y: N+ E, q

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

: J! ?; O9 T/ q+ X* ~

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

2 O- I+ s5 K* K: f

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

6 z% o9 Q. S' I. V# f8 m/ z

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

% K. p- l: o! Z

ls = LightSource(270, 45)

6 c' E/ H s8 ^7 P* ]" ~

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

( x& M- u# ?2 ~* U! z+ a

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

) v- T/ M! m0 F3 q

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

- E" D9 d5 \3 f# B4 S' K, q

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

9 S& u4 k: N8 ^9 G

plt.show()

% x) r/ H0 u& N: T* [ ( f+ `3 r, x, G) n, \7 }

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

. Y e. }7 A4 N z 9 B/ R, B. [ z/ }: x! ]

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

' @. o) O n9 l/ Z: `) m 4 d! S- w1 h# B1 z7 q7 x

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

; \* l4 v- V( d D3 H4 C! K x8 \! A) K

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

2 ? Y5 V/ J9 H * m& o, h9 {, Q

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

0 s& a8 w- z1 N( ^: h; d" C 8 ?( t# p3 I x/ F# P
/ R+ O& \9 y6 I/ h; U1 M% D) X' c
8 R* a) T5 J. w9 @2 A( d4 O
8 ~4 {; r+ H* c# l y P4 H# }! l: C/ X + o7 c% K' z6 F' T3 U- l& @' f( \& l9 m- A+ ` " z& f2 j; g3 u3 Z7 h
回复

举报 使用道具

相关帖子

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