& Z1 W% \ D' L- f 在我们科研、工作中,将数据完美展现出来尤为重要。
: Z) g( O* R# c8 c5 k 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
N# W4 M6 j. h: \' p0 m: U* a
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
/ `5 \/ H$ E6 O Example 1 :散点图、密度图(Python)
D" R& R8 |! m
import numpy as np
* m* Z; E0 t$ {5 Z
import matplotlib.pyplot as plt
8 g% }4 p! {2 y # 创建随机数
# O8 _3 L( e% ^$ O
n = 100000
. ^. |- z& A7 G& v* T6 L
x = np.random.randn(n)
; K, H* M6 ?) n
y = (1.5 * x) + np.random.randn(n)
& N3 o, \- C1 U! M5 D; T* M fig1 = plt.figure()
" d9 ?8 y( a# b plt.plot(x,y,.r)
, y" J, g, e) p/ L plt.xlabel(x)
7 _! H$ C: T9 M6 F- C. q+ ]
plt.ylabel(y)
# B" |" [1 O. V3 Y* w plt.savefig(2D_1V1.png,dpi=600)
8 ^/ i2 |1 D0 r/ P3 W nbins = 200
; K3 k1 C# D* g. b
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
' ~: @' p! w; B # H needs to be rotated and flipped
- X8 e8 n G) |8 _8 J. [ }7 f
H = np.rot90(H)
6 [* o1 w! a; W% S% e
H = np.flipud(H)
) v7 R, N2 y6 K7 r
# 将zeros mask
& |8 S: |$ y0 ?5 V
Hmasked = np.ma.masked_where(H==0,H)
; q2 B' M5 t( j8 h6 ^
# Plot 2D histogram using pcolor
, u8 I, s* o( g4 o' G/ y2 M2 k& W fig2 = plt.figure()
( B6 A: S+ A! e1 u; u plt.pcolormesh(xedges,yedges,Hmasked)
$ c1 `- q% a2 S! ~) s9 e+ M
plt.xlabel(x)
5 k; c: u/ B6 x plt.ylabel(y)
( L2 s% _4 P2 S9 H+ s0 d# R; j2 v3 o9 P# } cbar = plt.colorbar()
4 R* C3 r+ k, R& S7 E0 [8 L5 H cbar.ax.set_ylabel(Counts)
J3 \# r$ a( k- S5 B' E8 N plt.savefig(2D_2V1.png,dpi=600)
% x" @3 N9 W9 L p) B8 [* W plt.show()
! d0 ~ c S8 X
9 G. f3 Q2 ?6 @0 v; Y9 [
8 t. l# I2 U/ e% K' | 打开凤凰新闻,查看更多高清图片
/ b8 v2 h$ ~3 R5 Z: \0 \2 j
0 j2 _! s' l2 w8 o2 f- q; ~0 _7 P; \
* v5 C7 l: L" B5 r 
_; u' H/ H5 d9 Z. L! w
Example 2 :双Y轴(Python)
4 w& |0 T* o$ G1 o import csv
$ ]5 s5 d6 M% S6 k
import pandas as pd
1 x: H" ?& U3 U: V' t; A+ f
import matplotlib.pyplot as plt
0 t9 [: {* h& G: C from datetime import datetime
8 m8 M6 ]2 M2 |4 u data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
r8 y! o8 b0 `1 h c$ K" U time=data[date [AST]]
" Z3 l. e9 P' }7 \+ F1 a* i sal=data[salinity]
! ^, h; n: p* V, i6 T; D0 v tem=data[temperature [C]]
8 s0 W5 p! d! y print(sal)
t$ q: C$ d) ^$ h: E6 L DAT = []
/ g2 k T- R; `3 {
for row in time:
4 q/ I. g" k5 t, j+ ^2 K5 w; W DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
" }8 e0 @/ u g" E5 U7 |1 I #create figure
/ h0 w8 f+ l/ m
fig, ax =plt.subplots(1)
- m4 |; e- `9 J S# ^
# Plot y1 vs x in blue on the left vertical axis.
( _& h6 y% e1 g# g; v* m c2 V plt.xlabel("Date [AST]")
% _7 v% A* P$ B3 ?4 b3 `
plt.ylabel("Temperature [C]", color="b")
$ r, y1 H' B W% E
plt.tick_params(axis="y", labelcolor="b")
4 S* }; S# H! R! f5 Q% X# S! d
plt.plot(DAT, tem, "b-", linewidth=1)
1 E1 X5 b6 N$ G1 y3 U plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
: a/ m1 j. W, z3 u0 }
fig.autofmt_xdate(rotation=50)
) j: f' B& s0 ?$ o p. C
# Plot y2 vs x in red on the right vertical axis.
0 e2 f, E7 Y3 \4 v- M
plt.twinx()
! g7 G( v8 u4 f7 b plt.ylabel("Salinity", color="r")
0 K. O. T# O: S5 n. j plt.tick_params(axis="y", labelcolor="r")
# y: t& k/ _! S* k, z# z8 c0 @ } plt.plot(DAT, sal, "r-", linewidth=1)
# X0 M9 t3 p- T- F {% K! k #To save your graph
' `" R: V; ?: z" e$ z1 b& ] P0 H plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
3 K Q2 R' V: X$ f4 E
plt.show()
3 Q0 |' x& Y0 }0 L* y0 q

" X1 y5 _# B; P- r- ~, @ Example 3:拟合曲线(Python)
9 _5 E" @- F* r0 H import csv
, l5 k7 P7 \1 \; }( A+ a
import numpy as np
* f# h' F$ @+ |2 U8 j# C- Y import pandas as pd
% w2 M& z( D u, H from datetime import datetime
6 z% B4 S2 P% Z+ o+ H3 B
import matplotlib.pyplot as plt
/ n4 f! P: C g$ n: i" I0 Z: t import scipy.signal as signal
/ w* w2 q3 K* f# Z* C* ^7 |9 ~
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
6 }' }4 v+ p: N, M K2 m% z8 }& D time=data[date [AST]]
9 _5 a' ^! D3 R T temp=data[temperature [C]]
+ T0 w \1 y2 S% J
datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
! B" U4 O5 `+ Y& h# k
DATE,decday = [],[]
# v+ h8 {) H! |" h3 i" }0 g. ? for row in time:
* q1 r) m4 ^& ~7 k! d: R daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
- z+ x0 j. C; M& O+ d DATE.append(daterow)
. {" S3 a" C' j* y, Q1 }- J decday.append((daterow-datestart).total_seconds()/(3600*24))
V" `, G6 P0 K9 F9 _' y( d' T; G # First, design the Buterworth filter
/ n0 s7 P7 S- e$ z6 l) G N = 2 # Filter order
( C! e, X- R' {; ]6 s) k* S2 [; h; ~
Wn = 0.01 # Cutoff frequency
$ X" M1 ]5 l6 ?% t" Z) t* N B, A = signal.butter(N, Wn, output=ba)
6 W; @* L5 N, v" v3 i # Second, apply the filter
* |$ g8 E$ v3 k( V tempf = signal.filtfilt(B,A, temp)
5 R% k& _* \. A# x) j5 ]! \ # Make plots
+ L0 [! R+ |3 Q; M7 x& v: C fig = plt.figure()
* H* j% ?4 v- C0 L. q/ d
ax1 = fig.add_subplot(211)
: u) \4 x! X' r; M2 |) ? plt.plot(decday,temp, b-)
/ x0 |/ g$ G2 y
plt.plot(decday,tempf, r-,linewidth=2)
6 \! j3 Q; z% B' d; [7 ^3 l% c plt.ylabel("Temperature (oC)")
7 c- |9 t. o6 E( G
plt.legend([Original,Filtered])
4 E3 ?) c. D2 L plt.title("Temperature from LOBO (Halifax, Canada)")
) S2 y) F0 v n& X: L" ?3 f ax1.axes.get_xaxis().set_visible(False)
F2 I8 G" N5 }: r( j- }0 }# T
ax1 = fig.add_subplot(212)
) B2 `- e/ M& G2 G, x* p
plt.plot(decday,temp-tempf, b-)
+ Q9 g4 |% I8 J/ |& P7 t plt.ylabel("Temperature (oC)")
" }1 W' v3 O N" _
plt.xlabel("Date")
6 j* i, i! s `9 d5 `
plt.legend([Residuals])
1 W6 `4 j3 B! z: ~2 b" ]3 n
plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
9 w8 B- a& x+ \! e$ a+ r' M0 g, ?
plt.show()
" _6 W9 p G7 z1 w2 T' h

`' |$ i$ P& }5 S# E Example 4:三维地形(Python)
H; u! c2 w1 e, P' D+ p2 Z6 c% u- x
# This import registers the 3D projection
% N( V' K4 o. u( o from mpl_toolkits.mplot3d import Axes3D
$ `2 F* I! n+ z9 W: ~ from matplotlib import cbook
. d* c' |1 ]- l" q# H from matplotlib import cm
+ X, X, Z$ d2 p- I! w5 \
from matplotlib.colors import LightSource
. W: e" h: S; } d import matplotlib.pyplot as plt
& _! v: O! _ g3 S7 ?/ ?! Q2 q import numpy as np
, c6 }4 Q; k( x# R9 o! _3 z
filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
4 @ v+ i+ t. g; x5 U
with np.load(filename) as dem:
; c1 M. z) G. U
z = dem[elevation]
3 w7 w/ Y: |8 S( | t nrows, ncols = z.shape
. m( }/ y E" E6 V x = np.linspace(dem[xmin], dem[xmax], ncols)
8 h' @' V2 O( P$ i1 ]" l1 N y = np.linspace(dem[ymin], dem[ymax], nrows)
9 @0 q3 n) _1 O; Z9 ?& C x, y = np.meshgrid(x, y)
& a$ F; m6 m: q
region = np.s_[5:50, 5:50]
: `* Z5 [! c3 C! r5 q
x, y, z = x[region], y[region], z[region]
5 V7 U% x- d' ?7 g/ ^
fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
9 K/ S2 `6 Y5 p' Y3 \ ls = LightSource(270, 45)
4 h+ q9 k% j: {2 l2 N6 c
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
1 B6 X" l* _6 V
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
. _& ?: _9 u0 j/ w, J& x linewidth=0, antialiased=False, shade=False)
& Z( v+ a! S+ G( R/ | plt.savefig(example4.png,dpi=600, bbox_inches=tight)
: V* F6 D% n( x# \, K1 x
plt.show()
" p/ o1 b) ]- U! [5 e9 Q 6 R# w( s: Y3 m) y% a
Example 5:三维地形,包含投影(Python)
/ h! E+ c- E4 A" d! D% `
& O7 A" x+ [. W5 F% G$ A9 _* \' Z Example 6:切片,多维数据同时展现(Python)
( k8 y$ O& Y8 C
, e; _+ H) I8 [# [2 k
Example 7:SSH GIF 动图展现(Matlab)
i# @# f& a! f6 W
; s! H, c( g) X) T% @3 i" g# k Example 8:Glider GIF 动图展现(Python)
7 }& A) ?9 }9 B6 d, K2 x
4 X" y3 \) j2 m8 G4 R( L; K: M1 b
Example 9:涡度追踪 GIF 动图展现
6 r$ J) t( A6 ?; A l$ O! V / _4 [/ I) |# Y6 S/ U |* ^7 h