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

[复制链接]
0 Y6 m9 `" F) I; U9 R
2 x% z8 z6 J/ p- ~' i
' a8 m' ~! n1 ?+ L$ A% `
9 n% H: W# \6 a

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

0 B( b7 j8 n% k

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

* e' s9 t, z; k0 \/ T. g2 E2 i

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

i5 e( v" c( C

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

: b: r& }/ {8 }! { t' A

import numpy as np

. A) u6 h! J! V* ]& @8 O7 Y$ K3 h

import matplotlib.pyplot as plt

. ]" k3 }( G" \* y* c. k( V1 K

# 创建随机数

8 p: [! Z3 C" T: r. y4 R

n = 100000

4 b& b" Z1 V l, ]5 ?, W% r% e

x = np.random.randn(n)

+ @8 P9 {# k9 J

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

" r1 R3 t+ n" y% K/ M! Y

fig1 = plt.figure()

* R: y: [4 |2 W2 m' ]; u l* A

plt.plot(x,y,.r)

o& t$ @- c# m; z. f: X

plt.xlabel(x)

6 w) F, H+ V: y* L! ^* P' [6 h' p

plt.ylabel(y)

! T# u: J! J2 }% T

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

J2 U) y* b2 {) ^# e/ X

nbins = 200

% r% {5 E( x' @

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

0 u4 [8 E, g; [ n, {; O+ A

# H needs to be rotated and flipped

! H/ m- [5 U8 r' O3 t

H = np.rot90(H)

' E" } F' a* H5 v) {! a* H1 u

H = np.flipud(H)

' K7 O- n$ X9 B$ O

# 将zeros mask

6 R3 J- d H: f5 v" J

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

1 D: r9 K# D. ^9 C* \

# Plot 2D histogram using pcolor

' N* I% C: @% |5 |! H( O7 _

fig2 = plt.figure()

# V1 C" W; [; V1 v

plt.pcolormesh(xedges,yedges,Hmasked)

& e7 p1 a- X; @9 n6 S

plt.xlabel(x)

' }$ |! g2 L9 Y2 f; }3 B

plt.ylabel(y)

# t5 s( B1 k o7 G& |& k9 `

cbar = plt.colorbar()

8 T$ I) Y1 n( g7 P7 O1 b

cbar.ax.set_ylabel(Counts)

5 l7 u; n6 p" ]: y

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

5 q0 v: o* P0 t

plt.show()

4 {( x* o, V" m- y
; V: \: v2 M3 D1 v" J! x, d6 v
) R/ {6 w: {* g% {7 \
打开凤凰新闻,查看更多高清图片
0 X) O8 G8 o. p# x: k
' a+ n' o2 Z( K8 X9 i& t u
3 w' _8 y% n5 e# g8 J

. R% L9 ` _% b7 V7 |" C

Example 2 :双Y轴(Python)

9 v" {: k0 w! q2 i, q3 F# | a

import csv

% [( |, T. Q8 G! P: b4 M+ K! z

import pandas as pd

, } H& j' q$ X8 }3 R8 ~. Z1 {

import matplotlib.pyplot as plt

' e$ g1 l+ F: ^8 @4 l

from datetime import datetime

4 T* v a9 V8 t) L& T

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

; k6 t$ c" E8 j+ D# ~5 A! {

time=data[date [AST]]

0 @4 e% z! c1 D9 H3 u" j ^

sal=data[salinity]

. u* @* \5 N2 G c2 R4 b

tem=data[temperature [C]]

$ ~, q( ]( O, [: F4 _

print(sal)

" x, L' E! ]' T, _* w

DAT = []

! Y! s4 B) F! e( [9 U

for row in time:

2 U. F/ {! a1 Z6 s9 z

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

. Q6 A P) V: O* ^' Z4 A

#create figure

0 d- i R! O! m1 r! ?

fig, ax =plt.subplots(1)

& D! Z3 M- x" z# N& C

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

+ O, z, J$ f: G3 G' B2 i+ w2 G

plt.xlabel("Date [AST]")

3 r$ L5 S4 \ Z# C

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

- @/ o Y, N1 x" q5 ?! ?$ t

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

5 v2 ~. K2 F5 f' l; N! s

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

4 S# S" }2 n0 I" l) x

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

. x4 \$ I! Z* y2 m0 a/ R4 ?. M

fig.autofmt_xdate(rotation=50)

& p# f2 y" g* O: z7 R% F

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

2 O- H" I x5 p/ `4 a! M

plt.twinx()

/ j* C6 i. B$ j t8 p

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

0 v8 n, @; j0 J/ w

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

8 |+ X/ {3 x7 s- Y3 ^0 W2 G) y

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

# ]4 l0 e- c3 J7 z, S# |5 K, b$ g

#To save your graph

& w3 d# e! w9 p. j* _' L$ l; \

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

+ i0 }0 v5 e. j( L

plt.show()

/ a: ^8 `2 V( B% b, m

0 r4 d9 m+ M5 K. G

Example 3:拟合曲线(Python)

2 V' O$ u, o# R% v; x& ~

import csv

& y; |4 H3 Z3 L V( B _ _" v

import numpy as np

) K: h# `/ `* \

import pandas as pd

# N I' c% l$ H% P8 n* U

from datetime import datetime

% Z( F2 Q+ p, A6 A* l9 O

import matplotlib.pyplot as plt

0 k4 X0 ?! n4 W( `& Z% w

import scipy.signal as signal

* E1 ^$ R2 Q. N+ Z" {0 u: R

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

* A' M6 i6 c0 K/ c5 d+ }) I

time=data[date [AST]]

2 Z* {7 L) }9 |, j8 @

temp=data[temperature [C]]

, _' s( L6 m) y

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

! H8 R$ @2 S8 d' Q s! J4 X" O

DATE,decday = [],[]

: a+ W8 J0 W4 f1 `5 W" M3 T1 Q

for row in time:

( L/ B; U, y3 V0 Q$ \3 w6 s, e

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

$ O3 C. d, d) c2 o' I

DATE.append(daterow)

$ W8 Y$ |0 O/ _' ?/ g( L

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

' S: a5 T. ?2 Y' z% C7 z1 _

# First, design the Buterworth filter

# U3 s3 \ _% n, P

N = 2 # Filter order

5 I" N2 S! w- k& F% y- Z' c

Wn = 0.01 # Cutoff frequency

7 S# t% m, F$ j7 K! B' U% K

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

4 Z' W+ ]) b0 X% ~7 j8 x# y V

# Second, apply the filter

+ U1 Q, C3 l) g* h7 V4 M5 A3 L% U

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

! K9 Z# r. H; P

# Make plots

" i* ^3 d* y7 M( X5 T

fig = plt.figure()

! }5 Y6 J! y4 ]/ F

ax1 = fig.add_subplot(211)

) G, v' j' F$ Q

plt.plot(decday,temp, b-)

- O4 f8 r3 q. c( l3 j# [

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

5 k( O' g4 t$ G; `8 A. ]1 m! k

plt.ylabel("Temperature (oC)")

8 P8 D+ u/ F3 Z/ a* k) v9 W

plt.legend([Original,Filtered])

" S/ R1 _+ n* j) }: K$ _% [( o0 d8 K

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

2 `; Y# l- n) {4 b6 z4 g* L2 V

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

+ \, P0 X; m8 U, F

ax1 = fig.add_subplot(212)

; ?/ Q# Y4 \% o1 [2 x8 R$ L1 G

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

. z* p j# R; J

plt.ylabel("Temperature (oC)")

1 K! N& o1 s! K$ L! U. y

plt.xlabel("Date")

$ ]; f( I8 A0 j- Y3 a

plt.legend([Residuals])

1 m- w/ \& s1 ]1 {

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

$ I+ z5 L. X% W+ p' h) T/ k

plt.show()

- F X7 F# `/ u

/ ]; A! m, ~+ A3 h6 y- [& v

Example 4:三维地形(Python)

" l [ b4 x3 `4 L8 Z3 h* u% m

# This import registers the 3D projection

* W# w7 Y+ E! I+ h D

from mpl_toolkits.mplot3d import Axes3D

' y( D& T& ?( L4 B; a9 H7 ~

from matplotlib import cbook

, m& \, x% ^9 C( `' b) l3 [. m2 Z! Z' [

from matplotlib import cm

2 D6 g, I7 S4 N: ]

from matplotlib.colors import LightSource

& m w$ P1 a+ c8 ^

import matplotlib.pyplot as plt

9 V8 }% Q6 _0 A; H0 F( p+ e/ I7 L

import numpy as np

0 x& o; ?" v2 A9 t6 C, Z# f" a

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

1 L5 O+ f8 b$ V o& T

with np.load(filename) as dem:

3 x4 o+ h9 M: ]

z = dem[elevation]

/ N1 H6 Z; D5 l( S# V+ p

nrows, ncols = z.shape

+ T- r$ `- |. s, o7 U

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

; Q; Y4 O4 O4 p/ |1 T# a3 y! c

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

+ d+ n# P# O' Y6 _ V0 A

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

' q2 L: v7 Z% p6 I6 H

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

! i7 b' E, c L4 z$ g

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

4 g- u3 {6 ?+ h R/ h0 A6 j' H

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

0 v, k: d/ c$ n4 L! h6 Y

ls = LightSource(270, 45)

+ Z a6 ]8 o. B9 ?/ r

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

0 i5 [0 w. P5 z4 t# m% V

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

: k- ^6 Z, [7 }) ~) s4 ]# ^

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

3 u# S" F4 b. C$ b

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

]! c9 r7 k. |+ L u3 A+ n

plt.show()

5 J2 G' D- k# j$ g L+ T - I$ }- m6 h6 u, P! l& N# @3 k( `5 N

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

& N8 s3 P" v7 X8 c5 S7 V- k7 L . M9 g4 B/ m% V8 ^

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

7 @; w! U% ?8 J5 u 6 T0 f- ?& K( j3 u( Q, u

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

# d2 A+ }6 T$ U0 S2 X 5 W8 p$ N- t: u5 C/ z& \2 [

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

# v; B4 Z2 u) v9 ^! R' X" w. B 3 M3 W* Z6 P6 y2 v

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

) t# Y/ J2 T' [- U1 S7 @ : ~# l% s) P$ E# G" b3 g7 z
/ U$ t+ C' I; X, f, z" h" |
) h6 R0 d7 g7 n+ }
$ O" @( }& @- _& o2 I& L2 H" D T! S* x, U9 l, {' D7 c ' k X2 v( x8 _ F3 k" } % l: v4 w. c+ R. W8 o$ w + B: a1 g1 s% v x8 G* J2 W
回复

举报 使用道具

相关帖子

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