3 S1 O; T" c |5 W( z/ ^, e+ V% {
在我们科研、工作中,将数据完美展现出来尤为重要。
9 _; _7 M/ u9 K; _0 k 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
: A* ]1 a8 w: Y4 O7 k1 f
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
4 h7 ?$ i* o) g' y
Example 1 :散点图、密度图(Python)
' m! U; v# \6 _; x import numpy as np
6 X O- A# c- Q& [- [ import matplotlib.pyplot as plt
: |- s1 n# K! t& q
# 创建随机数
0 j* T1 O2 g* c) D3 A/ Q
n = 100000
- `' ~* i; i6 l/ A& } x = np.random.randn(n)
" `4 R) M, e( ] y = (1.5 * x) + np.random.randn(n)
d7 R5 N4 i0 C8 P fig1 = plt.figure()
- P5 P4 Z% f5 Z- j" M# W plt.plot(x,y,.r)
. e2 `5 b8 c; `, Q4 \ plt.xlabel(x)
# W- m9 s* [( ~: P# `: N
plt.ylabel(y)
0 M3 n% L8 Z. Y9 G) @8 B/ n- n' x
plt.savefig(2D_1V1.png,dpi=600)
+ u8 J X8 k" q; p- h/ I
nbins = 200
! c8 M- l' [& H& E
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
/ t5 Q/ W" i- \6 y5 z- H& W # H needs to be rotated and flipped
( X v+ c) |9 J) ~ H = np.rot90(H)
4 x% R. V/ J# v0 ?4 N! l2 q- o# F H = np.flipud(H)
: n; d* g+ ~) a; ?6 D8 \5 @ # 将zeros mask
+ K" ?3 O. G |7 m/ [$ H) G/ F Hmasked = np.ma.masked_where(H==0,H)
" z% H* N w3 e% g" x/ [$ |. Y8 Z
# Plot 2D histogram using pcolor
/ ]4 w; U p5 f! B1 d
fig2 = plt.figure()
) l4 S% D( z- P/ G$ f, B plt.pcolormesh(xedges,yedges,Hmasked)
2 m, e3 n" w, s! H! J8 T
plt.xlabel(x)
& ]9 E' E4 ^0 l+ A
plt.ylabel(y)
3 M( i3 F, r9 p' z cbar = plt.colorbar()
9 U8 |4 e7 `) p& F: H! H: z) l. c
cbar.ax.set_ylabel(Counts)
( o, I7 g% {( y* L+ x
plt.savefig(2D_2V1.png,dpi=600)
, X& o9 h \% W
plt.show()
" i. m2 n a% b* W) w% U
3 L4 H) v. x' y: u% [, T
& x' t9 ^7 b. ^; R$ J 打开凤凰新闻,查看更多高清图片
- L: ^8 ^* c& a+ ~6 `! x
7 d! g5 q& F; d. O1 v ~& g. B
, P; ]. M# i2 i% h& Z9 {& i 
; f2 h4 b+ k e4 W9 h Example 2 :双Y轴(Python)
/ |/ k0 n; j6 x0 G& s Q i2 t$ u s
import csv
& c9 U- ^( r. a$ r. I import pandas as pd
' a3 |0 v% p& R
import matplotlib.pyplot as plt
( z3 D9 P( Q% B0 w$ A0 E5 G6 X from datetime import datetime
5 c# X& i) Q- U- H; a. s6 [ data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
) h V5 D) ?" W' y! F. j time=data[date [AST]]
$ }/ A% q$ c# G3 B/ U# Z sal=data[salinity]
9 Y& ^, s; `% b T
tem=data[temperature [C]]
2 Y! z8 I. ?6 t( { print(sal)
. f8 ~8 [4 }; k, V DAT = []
- n: ?& W) `. a( o/ b for row in time:
5 V7 P; ^8 }7 |1 ~, l+ { DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
' | p0 e/ ]4 W5 W ?" ]4 o, @8 g
#create figure
4 k2 ?, f' e' \
fig, ax =plt.subplots(1)
/ p1 F, j+ w2 ?& x, M& a" l. y T( S+ g
# Plot y1 vs x in blue on the left vertical axis.
' a5 K: f- g! Q. c; g# C2 }1 t
plt.xlabel("Date [AST]")
% P$ T* Y5 ]0 W# `3 F; A plt.ylabel("Temperature [C]", color="b")
. n4 _! A4 T& x* m2 X
plt.tick_params(axis="y", labelcolor="b")
5 B& `5 m6 q5 Y! ? c9 u
plt.plot(DAT, tem, "b-", linewidth=1)
, l) A ^/ I4 d* Q+ z! b plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
# }; k! y% y$ Q, d fig.autofmt_xdate(rotation=50)
! H6 |; U' c% S
# Plot y2 vs x in red on the right vertical axis.
$ H$ J" V: X$ O* f* t( P( }
plt.twinx()
6 n; q6 B8 |- M9 `# ^
plt.ylabel("Salinity", color="r")
2 n1 b2 V5 W* g* {; W/ | }
plt.tick_params(axis="y", labelcolor="r")
4 |3 D9 _8 k8 y5 A5 N0 L
plt.plot(DAT, sal, "r-", linewidth=1)
7 d0 y9 O9 N7 T- @' ~ #To save your graph
+ ]" w" w) M: r7 `6 T) x
plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
- ^3 ~1 [5 O- h plt.show()
2 E) b* P: X* z& `/ w5 |3 s

4 E' y: V" {$ J- ^4 \& q! w0 P Example 3:拟合曲线(Python)
+ z# _. x- j; k5 i
import csv
4 h$ w2 m+ A5 |
import numpy as np
, \& ?% C9 }7 B import pandas as pd
4 Q6 Y6 \) S$ o* v
from datetime import datetime
! ~- ]& J: o. I' Y2 Z' r* S
import matplotlib.pyplot as plt
8 X5 n0 H% ^* ]1 M$ e% N import scipy.signal as signal
# ^; c5 h1 z" h data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
9 ]4 c6 t; J" k! C
time=data[date [AST]]
- o% J( I' T% J) L. u
temp=data[temperature [C]]
( n# I' C* c0 Y1 T datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
2 B4 F& n3 i: N* r DATE,decday = [],[]
: B0 n: H6 h: \* m7 |$ O# E& Z for row in time:
, d: E- Z6 N, X6 e" C2 c0 Q3 A# ?
daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
5 O5 o0 N. x- G% q2 Q# r4 O DATE.append(daterow)
; s# N8 ?+ h; L2 s5 ]& A O
decday.append((daterow-datestart).total_seconds()/(3600*24))
2 W1 M: {$ }. m+ b }
# First, design the Buterworth filter
* M& W% k. J% z# o$ Y& o N = 2 # Filter order
! M. d& V& D9 C. M' ] Wn = 0.01 # Cutoff frequency
( |+ I7 f7 z J E( e7 f# u. F/ R
B, A = signal.butter(N, Wn, output=ba)
$ F8 e2 a9 h" v- e" P # Second, apply the filter
* }) X* Q0 u' H& ]: k/ [ tempf = signal.filtfilt(B,A, temp)
& n7 j& N" r( T' R c } # Make plots
. H1 V$ I6 `2 Z, C* V0 p fig = plt.figure()
! {& D* s1 p. q" ?: K$ c8 e( V# x
ax1 = fig.add_subplot(211)
' Y1 a: K, B* ^' J plt.plot(decday,temp, b-)
; _$ X, ^: j) x3 h
plt.plot(decday,tempf, r-,linewidth=2)
) d1 q$ t5 z3 e: x+ T& v
plt.ylabel("Temperature (oC)")
" S- i i$ a% o( x: q: x& B' ~+ k/ Q plt.legend([Original,Filtered])
: x! M9 h$ D* e plt.title("Temperature from LOBO (Halifax, Canada)")
! x G3 c4 t( N& z
ax1.axes.get_xaxis().set_visible(False)
6 V+ t0 M0 G' V ax1 = fig.add_subplot(212)
% X2 @% F. X1 k1 y# q; V
plt.plot(decday,temp-tempf, b-)
- P2 Z; b, ~3 r$ j/ L plt.ylabel("Temperature (oC)")
" K- r/ P9 ]2 r
plt.xlabel("Date")
, z5 x1 k/ \$ p- j9 T! w- I3 p& Z# | plt.legend([Residuals])
/ J- p2 V) ]0 T1 M- o plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
# m% L" v$ [- v/ B+ \
plt.show()
! ?$ [* F& v" R2 g- B 
% y) h' t* N% R# c0 ?* ]
Example 4:三维地形(Python)
: l5 v$ C- T: c% V q
# This import registers the 3D projection
4 n p8 q7 P N" Z8 H6 l from mpl_toolkits.mplot3d import Axes3D
: ^! C+ s, U( ^2 k
from matplotlib import cbook
2 b$ q$ \4 @+ u. M8 k" g1 h
from matplotlib import cm
# P! P: z1 }' O3 u Z1 ?
from matplotlib.colors import LightSource
9 q' R5 y0 I+ m6 |7 h import matplotlib.pyplot as plt
: B) r3 \4 a4 d3 c
import numpy as np
# Q; S2 N, c9 }0 p! s! S
filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
8 D [$ m2 m1 u8 m with np.load(filename) as dem:
! `, B8 i" p7 C1 } z = dem[elevation]
5 N: O7 K5 l6 S$ d( H
nrows, ncols = z.shape
0 T8 C1 S5 I: b8 M g' _ x = np.linspace(dem[xmin], dem[xmax], ncols)
+ @( ~( p$ p. W7 c
y = np.linspace(dem[ymin], dem[ymax], nrows)
9 \$ }$ j' O1 Z, g+ O
x, y = np.meshgrid(x, y)
: q6 j: X+ ?. n9 Y
region = np.s_[5:50, 5:50]
2 F! w4 Z! ~2 t5 r& L: V' b' H x, y, z = x[region], y[region], z[region]
5 l2 N# r' d* }
fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
; e0 r" B+ T3 K% f8 ^1 ?. p1 m
ls = LightSource(270, 45)
- d& J* f$ `/ @: u, N4 }, r rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
5 ~3 t' ?2 u. m9 r% t1 n; d1 A
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
! ?* Z2 d4 B+ a" N" F
linewidth=0, antialiased=False, shade=False)
r8 b# x. i1 k1 v
plt.savefig(example4.png,dpi=600, bbox_inches=tight)
( ]4 [4 u; L- g. B% ` plt.show()
]& X: m+ a* r S% h/ O, _9 w/ Z" g; W
Example 5:三维地形,包含投影(Python)
" h( N# w B: u) Y9 S
3 _; A: ~$ w% |' p$ s
Example 6:切片,多维数据同时展现(Python)
3 h/ V {$ `$ X* L# [, K
* M, h$ M# @ j; N, \ Example 7:SSH GIF 动图展现(Matlab)
* M! o5 y- Y$ \$ u$ N& K+ d
% I' y. |2 z2 z' D9 E' I
Example 8:Glider GIF 动图展现(Python)
- |# @5 F$ g9 N+ q2 V+ z: E# n - c, Y3 {/ N. p* Z @
Example 9:涡度追踪 GIF 动图展现
8 v- c, |% E1 r9 X2 r9 I- k1 o, r3 E
" [! z+ r, P1 }4 h4 ^4 s