% z& D: J2 r* v$ }$ X. g9 |, M
在我们科研、工作中,将数据完美展现出来尤为重要。
0 j9 K: B! {. H3 P, m 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
* [$ ^5 \$ ]. D: C' a 下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
: o* j) H, j! k2 `2 [ Example 1 :散点图、密度图(Python)
. z1 b/ z6 P% Q/ Z import numpy as np
4 t) W8 }/ Q( ~: w+ b- c, n
import matplotlib.pyplot as plt
) N7 N2 C, r7 I$ h: v) }7 F # 创建随机数
: v- g2 e: }) c8 k+ } d
n = 100000
; |7 L) _( B: z1 C* ^' O2 R% H; h x = np.random.randn(n)
" J/ |0 I6 G" n3 i/ ~
y = (1.5 * x) + np.random.randn(n)
_- A: Z2 m+ x' B4 y
fig1 = plt.figure()
9 Y8 C' [% x' C4 j plt.plot(x,y,.r)
j* \ O g* c t, z" G8 S% f plt.xlabel(x)
0 G( Q. b" k! v- { plt.ylabel(y)
- H6 O# v& P' h2 H+ Q
plt.savefig(2D_1V1.png,dpi=600)
" z$ t9 d3 e( N; g3 L
nbins = 200
" j$ {/ H6 M9 `4 g
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
# K3 m% L7 I* |; S
# H needs to be rotated and flipped
5 O b, ^) f; W, H+ X9 e
H = np.rot90(H)
( A! H% T$ F/ N* F1 V H = np.flipud(H)
$ A) ?& _5 o1 g3 l; E* y& g& m# A # 将zeros mask
3 l3 T, C; d9 I4 P: q: G Hmasked = np.ma.masked_where(H==0,H)
2 O9 d* D+ Z# O9 [* G
# Plot 2D histogram using pcolor
& X7 o0 u% o- D3 a7 H- b( b9 A
fig2 = plt.figure()
* B% i8 e# K- g3 v* p
plt.pcolormesh(xedges,yedges,Hmasked)
& h6 M4 ]: r; J: T plt.xlabel(x)
' b1 ]! L- {1 i6 m
plt.ylabel(y)
8 O3 A% L2 b# S
cbar = plt.colorbar()
% S, _4 r& t) m# l/ u5 q cbar.ax.set_ylabel(Counts)
3 _4 x/ B5 R0 l% |: d/ z
plt.savefig(2D_2V1.png,dpi=600)
& H( @6 y% R6 Y4 v
plt.show()
) `/ |. d$ w6 R
G" a5 M" G% C n
" P8 I9 Z1 |- h$ v4 A. [ 打开凤凰新闻,查看更多高清图片
; k! w2 K$ _, d4 _
8 P8 t+ P) U1 @1 W1 v4 A
. u+ u# t- t6 g5 \. a; Y3 t0 R7 r

* _9 S7 \9 e4 X3 W8 m3 K
Example 2 :双Y轴(Python)
" f C, {8 O z0 n, J" O( p6 O+ @ import csv
( Z. m5 o& I8 h/ u S import pandas as pd
, }8 Z' k+ g+ `9 { import matplotlib.pyplot as plt
9 B: [0 L2 i$ I. y from datetime import datetime
% x2 |; D0 v }: z: R2 @
data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
& _% n6 m u& {& g5 A2 y' n5 O time=data[date [AST]]
7 c) a1 P, U% h2 \+ x
sal=data[salinity]
8 o) [4 q1 `" b' j7 k. `, Z tem=data[temperature [C]]
g0 x% D6 e; d. \* k- z
print(sal)
5 w$ d. I9 k2 v& P% _ DAT = []
5 t7 e1 I- V" f, n3 S V
for row in time:
- D, U7 F- y; H: Y2 v& T DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
( V* ^0 O4 u! x! O4 f6 d #create figure
/ x8 i7 p0 f* a fig, ax =plt.subplots(1)
2 y+ d! O2 O( C0 |2 _
# Plot y1 vs x in blue on the left vertical axis.
% N% ], T; ~% ?* F, m2 X5 c' h plt.xlabel("Date [AST]")
2 C( `% O. M y. d/ G plt.ylabel("Temperature [C]", color="b")
0 k. B6 |& q" Y: o& x+ n9 E+ W plt.tick_params(axis="y", labelcolor="b")
4 ]* H( Z) r% q, e plt.plot(DAT, tem, "b-", linewidth=1)
3 p- B+ b9 `6 s! W* D3 B. s$ I% @
plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
$ l$ O* N* Q( V) ~7 m, i fig.autofmt_xdate(rotation=50)
" F; o6 _) x2 E) {$ K # Plot y2 vs x in red on the right vertical axis.
0 B( u, i* s: d! A6 j) J
plt.twinx()
+ B; p& q( q% H& k7 h; @ plt.ylabel("Salinity", color="r")
: H! N4 u- x; y( O$ h) B. F
plt.tick_params(axis="y", labelcolor="r")
0 [/ U4 H' h3 r( m
plt.plot(DAT, sal, "r-", linewidth=1)
3 S- B! b$ e) L; P; B6 U #To save your graph
- F1 C7 u8 q) f
plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
& D7 k! U: e3 s& j+ n
plt.show()
8 [: m' O3 w, W/ |% }& T+ ]3 b

) {& T# `: W1 d Example 3:拟合曲线(Python)
& r) Q0 |7 l0 ]
import csv
: z) R, N1 U, h7 @9 m8 ? import numpy as np
0 l, q# p! f" t+ c A2 N, }% F
import pandas as pd
) l7 q J8 M3 H from datetime import datetime
- `0 ~) c9 R# W import matplotlib.pyplot as plt
) K" P. t; X s& K" Q/ T2 M
import scipy.signal as signal
, t* d- a! n2 M$ y% E" P. o data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
- y# f+ `; p2 m- \9 ? ^& q time=data[date [AST]]
. ?9 H5 A* C* O' R; b4 K# Y9 v
temp=data[temperature [C]]
1 b" a: \1 g# y4 g: C0 p, X
datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
1 p0 L* H) c: A I
DATE,decday = [],[]
& z9 ?: s! B- V y; h for row in time:
9 N, V7 t/ O# G2 q5 z( z$ |
daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
/ D( G3 V b. d
DATE.append(daterow)
9 m# R6 p8 j) V' X; ^, A decday.append((daterow-datestart).total_seconds()/(3600*24))
: g% o# ~: p3 e # First, design the Buterworth filter
0 \( K# h0 G1 g2 {* E# n$ Q N = 2 # Filter order
( ?7 o' [$ c! F( m4 g, S
Wn = 0.01 # Cutoff frequency
% r% e1 N, P8 s( S* ?; M B, A = signal.butter(N, Wn, output=ba)
* Y: T4 r4 N3 ?, F! |) R2 c* Z
# Second, apply the filter
$ V' L' C1 N+ X# k+ S9 O- p+ O tempf = signal.filtfilt(B,A, temp)
% J4 C/ F( z. D: j # Make plots
: Q- C n1 d W R fig = plt.figure()
l7 h" F N' m. j4 @ ax1 = fig.add_subplot(211)
0 y) `; p, a9 R5 |' J# \# ?
plt.plot(decday,temp, b-)
" i/ p' z/ a0 S' ]; z* B, b
plt.plot(decday,tempf, r-,linewidth=2)
0 C0 \+ p6 i r) A! d
plt.ylabel("Temperature (oC)")
* |, P4 r# V4 N1 m; i plt.legend([Original,Filtered])
1 T) D3 `$ Q: A8 c plt.title("Temperature from LOBO (Halifax, Canada)")
7 m" n6 ~$ s8 w0 V+ v/ F
ax1.axes.get_xaxis().set_visible(False)
! j" W- [! k. }: F$ Y
ax1 = fig.add_subplot(212)
+ F ^6 t* v% k- G7 q6 K plt.plot(decday,temp-tempf, b-)
5 r% a( p5 O2 R! r) Y/ H. K plt.ylabel("Temperature (oC)")
2 h/ b2 r" n; k" ]# ~ plt.xlabel("Date")
- C; b k& ~4 y' C, Z
plt.legend([Residuals])
4 q z$ n6 ~5 |) V9 u
plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
5 Q* S9 s6 ^" s2 B$ [0 N1 ?
plt.show()
$ m' a- v. Z* h9 D, ~ t$ q 
9 C1 _/ X1 Y6 T" U7 b+ J Example 4:三维地形(Python)
y: _- \: d3 f q/ I) S, m
# This import registers the 3D projection
& L% I8 i0 J3 I, \ from mpl_toolkits.mplot3d import Axes3D
5 B. t1 F& {" g5 `% Q- s from matplotlib import cbook
2 Z- F" W' B; b# N
from matplotlib import cm
2 N2 w4 b0 F9 i4 r- K7 G- f/ S from matplotlib.colors import LightSource
# y! V# X2 {3 q5 ? import matplotlib.pyplot as plt
4 H+ u, C6 h& k; E- v import numpy as np
( u/ g% Q/ q% B filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
% T8 t( {( h h1 \& Q8 h with np.load(filename) as dem:
( H& c: G+ W# g- q; U% g% |
z = dem[elevation]
* n( B% w2 @. ?6 R5 V9 l$ c nrows, ncols = z.shape
+ a7 s1 j; P6 S% @
x = np.linspace(dem[xmin], dem[xmax], ncols)
, k* |4 ]; M! _0 R! ^5 ` y = np.linspace(dem[ymin], dem[ymax], nrows)
/ M, S: w0 K" H/ e3 e
x, y = np.meshgrid(x, y)
9 s5 w7 @2 }0 \: f& y; x3 {- t1 ` region = np.s_[5:50, 5:50]
" O8 b4 E3 r, S# J x, y, z = x[region], y[region], z[region]
" U4 ~( R% j. K8 |
fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
( L/ W* C* k( d! S ls = LightSource(270, 45)
+ h, a9 G1 P. `: k& n9 G rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
$ a5 N* @- S+ r; L
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
8 Q1 E# B# V4 E( S' T
linewidth=0, antialiased=False, shade=False)
$ \ j9 }0 [- ~+ O( c
plt.savefig(example4.png,dpi=600, bbox_inches=tight)
1 m* T% G$ N% j plt.show()
; d# j/ j0 | p) Z # R! ~5 V: s7 K" H1 z, c( `0 _
Example 5:三维地形,包含投影(Python)
4 v. \! p1 i. I/ x" I
* J/ `+ `6 D1 f1 \( f- K Example 6:切片,多维数据同时展现(Python)
: c. s3 K3 Y; J; _ " E, I7 x8 Q+ I( _% C( }$ f
Example 7:SSH GIF 动图展现(Matlab)
& b/ z; Z0 v1 ?/ V+ v5 ?1 }
% j: G1 i! e; N: e* v Example 8:Glider GIF 动图展现(Python)
+ |9 i$ h8 I& a
' `% }2 Z$ ?; J+ u+ w+ Q Example 9:涡度追踪 GIF 动图展现
; ^) r2 V+ E0 T( N, V# t
2 j0 x& c% r- V0 n/ b