5 l1 a5 R: m6 _4 r1 v4 ^
在我们科研、工作中,将数据完美展现出来尤为重要。
) N) O5 L, j# M
数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
6 `3 N& S1 p: W k9 Q
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
% I* }9 X! F* w3 l/ T. \ Example 1 :散点图、密度图(Python)
" F1 r/ F i! l. @
import numpy as np
' m: [* b x9 Z) T* b8 G+ F8 @4 n* F
import matplotlib.pyplot as plt
! @4 Y% M& |4 N$ o$ b' a, X& u # 创建随机数
; |, i$ }6 _2 | n = 100000
. h/ y9 m8 _' k# [5 { j, Z7 F6 q
x = np.random.randn(n)
7 l$ I% W, Y# G) G, s/ }5 m6 R y = (1.5 * x) + np.random.randn(n)
* E$ O, g6 D& D fig1 = plt.figure()
( ^) t# {- P0 C2 E8 x/ q6 } plt.plot(x,y,.r)
0 J$ _/ e* q5 P Y {6 M2 M
plt.xlabel(x)
! n3 }6 @8 X5 U* v S( n
plt.ylabel(y)
5 y- [9 R3 ?- W5 @9 @; l
plt.savefig(2D_1V1.png,dpi=600)
7 l" Z3 r; I5 h8 o0 ]6 C8 K) h nbins = 200
, ]6 O# q3 t7 k7 Z8 j# q1 I- w H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
4 ^3 J2 @$ z5 @* X
# H needs to be rotated and flipped
6 I. Y& Z+ {* G9 Z* y! O: K( y1 t H = np.rot90(H)
% f3 }2 \' @$ L& e+ x
H = np.flipud(H)
' R* c8 u# G/ }$ [% X
# 将zeros mask
1 O3 n/ W9 W; M2 r
Hmasked = np.ma.masked_where(H==0,H)
. K! l) B1 o* \/ s+ _" k) h3 d; P
# Plot 2D histogram using pcolor
+ U7 I- X9 |3 A/ y. } fig2 = plt.figure()
. h% W ^6 T. Q$ i
plt.pcolormesh(xedges,yedges,Hmasked)
+ j( K/ V+ E4 ]7 @ plt.xlabel(x)
- x* J9 c9 W2 ^3 S$ v( j* m; V
plt.ylabel(y)
3 o( n/ ?0 ?) {9 m. Z9 \) }, C cbar = plt.colorbar()
" h( g$ M) e: Q
cbar.ax.set_ylabel(Counts)
, J5 V0 s3 b" y+ p8 G! m0 P$ b plt.savefig(2D_2V1.png,dpi=600)
* Y: q6 D) C; O+ c
plt.show()
" K# X0 @# @* z* r; N% ^# r
: ~9 W* J% X: @
1 V1 Q+ e" G; N 打开凤凰新闻,查看更多高清图片
" G( t8 c0 v2 d
/ d" d: B! |8 |& [7 S
6 s; ?- ~2 V. c* s$ G

1 x1 [3 M1 x) N% q, F' }& h% W Example 2 :双Y轴(Python)
& b6 z5 ]( q7 O4 A
import csv
/ b: `4 `% }2 g0 r import pandas as pd
" q8 g4 e' b# j1 }$ D
import matplotlib.pyplot as plt
: s9 W3 X# _ d( u' \& I
from datetime import datetime
4 g* w( D7 e; p0 v6 {0 e data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
6 b) v9 l0 }, J+ d
time=data[date [AST]]
& A. @* J7 t Z$ l+ Q4 Y# U1 X' |. B sal=data[salinity]
9 _2 p# s+ S( V/ A4 e
tem=data[temperature [C]]
* ]0 Q! m: T/ o8 W* g print(sal)
. o- b% j/ j% a4 X. f) v7 w
DAT = []
# i ]: @/ r3 {: y8 P for row in time:
& [9 Q3 ^% o) {% k" |% S
DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
7 b+ L5 k5 I! y# Y& y; Y ?1 c% G #create figure
B9 d. M K; D7 ~/ V+ Y$ I8 X
fig, ax =plt.subplots(1)
- W n$ z% W$ o
# Plot y1 vs x in blue on the left vertical axis.
3 T& P1 o. \2 x; v, g# N4 U6 A
plt.xlabel("Date [AST]")
3 K2 S8 R6 O5 `4 g* Q9 K3 n ? plt.ylabel("Temperature [C]", color="b")
: D; t9 f ^$ { i+ ^4 W
plt.tick_params(axis="y", labelcolor="b")
% l `3 c% Q1 x+ J: `6 y
plt.plot(DAT, tem, "b-", linewidth=1)
9 A9 q' v _& f j& Y, ~6 U
plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
1 {8 g4 r5 I* `+ r/ v fig.autofmt_xdate(rotation=50)
5 ?" j7 {3 O0 r8 n% N% Y+ a8 r: v
# Plot y2 vs x in red on the right vertical axis.
* x' W5 Z$ P R7 T* k* _
plt.twinx()
5 {# z9 | f1 c" U2 h
plt.ylabel("Salinity", color="r")
* m) [# p- M/ u4 o; l! k
plt.tick_params(axis="y", labelcolor="r")
% V! D2 a. d7 r' m/ T plt.plot(DAT, sal, "r-", linewidth=1)
. h7 h+ X$ I) ^* U. M k4 d #To save your graph
- t. l7 o. d2 \3 c plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
' n& n' `% @2 x2 Y/ R plt.show()
* G5 R# r! o. k; @! s$ L. k: B 
9 c3 G0 b8 C: } ~7 C8 u Example 3:拟合曲线(Python)
# J; O: c& K) o* |( i- n3 d
import csv
) A2 F. ~1 O2 I; ?- f4 ]
import numpy as np
5 F6 o' v3 J& G- F import pandas as pd
$ `/ r8 {9 M: c" R7 i: D5 i2 b/ U from datetime import datetime
3 T- c: T" [' G/ b, }" ? import matplotlib.pyplot as plt
4 \5 J% c2 x- W( Q- S/ T. W
import scipy.signal as signal
4 g, e. q) H( y% u data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
7 W' U3 t) X9 ?/ d5 ?. ^: e time=data[date [AST]]
) W( A8 F* T* g8 E# z5 T* w+ p
temp=data[temperature [C]]
$ n6 }7 ?' J6 I datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
9 V3 E: _% }* t9 u" p$ [ DATE,decday = [],[]
. d* n7 ?- w1 ]. C6 j8 Z3 F! }* Q/ S! f9 ?
for row in time:
/ q9 N* o3 ^3 B. a daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
* q) U) v; n2 M) ~7 ]" Y" [
DATE.append(daterow)
( l# N. [5 ]$ ]- H0 o
decday.append((daterow-datestart).total_seconds()/(3600*24))
# O% y, e2 j. j0 L2 r- `1 X5 S
# First, design the Buterworth filter
0 C, f- M* d& H L N = 2 # Filter order
6 J6 o% h1 ^/ d Wn = 0.01 # Cutoff frequency
1 {: ^5 i, T6 h k
B, A = signal.butter(N, Wn, output=ba)
+ I6 \. k1 z3 T% H' C
# Second, apply the filter
2 o6 C* ^* G5 e9 A( d1 h1 P& e
tempf = signal.filtfilt(B,A, temp)
" b# K0 R5 \. u1 c6 [ I( g- \
# Make plots
, A0 d9 V" } I1 S fig = plt.figure()
3 J: K. ]2 |6 }' }( i2 l; @' f) N
ax1 = fig.add_subplot(211)
6 ]& K1 w" U, i5 P8 W/ ^ plt.plot(decday,temp, b-)
5 ?! q& X9 [$ ?' m
plt.plot(decday,tempf, r-,linewidth=2)
3 p6 f( w2 V5 N! T) Y g% C$ W& f
plt.ylabel("Temperature (oC)")
& G2 U: Z; }% H5 f" {) }+ s. l plt.legend([Original,Filtered])
; ]( p, p. z/ r0 y, @ plt.title("Temperature from LOBO (Halifax, Canada)")
* P+ x' W( y+ E2 ]
ax1.axes.get_xaxis().set_visible(False)
, q) f9 o/ \6 x" G; h
ax1 = fig.add_subplot(212)
! k4 N# r# ?; L6 r plt.plot(decday,temp-tempf, b-)
! z% I$ A# C9 }. C/ |, U plt.ylabel("Temperature (oC)")
9 r2 t% e: D- o& A5 W# S plt.xlabel("Date")
7 C5 r+ \9 c a C, g# m
plt.legend([Residuals])
; m5 M4 t+ Q3 q7 Q6 {7 L3 V" X
plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
) _3 S9 ]% n$ {. a. }
plt.show()
* W3 T+ y& i" \0 J1 B 
& M! e, p5 p$ W
Example 4:三维地形(Python)
0 G* c* C; v0 @ # This import registers the 3D projection
7 H2 _: ]9 J! C% ^5 k% @5 I5 }) u
from mpl_toolkits.mplot3d import Axes3D
% g' j0 ^4 i9 P; m9 K8 ^
from matplotlib import cbook
, d+ T: |8 a# Z: }% B6 a- g) `
from matplotlib import cm
6 @0 W. C' X% e& e% V7 T2 _' {
from matplotlib.colors import LightSource
- z, g) g1 O$ c import matplotlib.pyplot as plt
! ^, Y* z( M* K! b W
import numpy as np
5 ?* y. c1 d& G: e: {, X8 d
filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
2 R+ i- C% F, H3 K0 I4 e+ H3 F9 u; @" A with np.load(filename) as dem:
2 ]1 Q( S) \. I8 g3 m z = dem[elevation]
4 d8 ~2 X2 ^7 D+ a: Y nrows, ncols = z.shape
U9 \) h2 Y+ ~3 s r7 ^ x = np.linspace(dem[xmin], dem[xmax], ncols)
; l H6 @" V6 C y = np.linspace(dem[ymin], dem[ymax], nrows)
. R6 @% Q% `/ L" E/ q4 d4 P# Y
x, y = np.meshgrid(x, y)
- ^3 Q8 C; M% R" k region = np.s_[5:50, 5:50]
( {' K# X B+ e* x+ U x, y, z = x[region], y[region], z[region]
: X3 _' v' p% i9 q$ H% [
fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
8 S! T( X5 J Q& U) K ls = LightSource(270, 45)
0 r% I5 T8 {( x4 ^+ C7 ]# H rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
* Z# M$ a" t* {4 T/ g
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
8 a- O! K, b# N/ e1 f
linewidth=0, antialiased=False, shade=False)
( R) Z& Q1 M$ N% D( Q* G5 A
plt.savefig(example4.png,dpi=600, bbox_inches=tight)
# ?1 K+ G: @. U# Y0 K+ b
plt.show()
# }$ B& [1 B0 t, J' n( N. [' X
4 w6 ?) O q" b. N0 h Example 5:三维地形,包含投影(Python)
1 H6 z2 a6 v X: v 6 p' Q! I' F( U/ v$ _
Example 6:切片,多维数据同时展现(Python)
" d3 a& e6 G' c' G5 ^5 ?. K
' L' i$ g1 C' P9 W4 A* v/ m9 n
Example 7:SSH GIF 动图展现(Matlab)
7 Z* M# U' s: s- Q5 T, y0 a
/ b( g$ S6 _9 G% j' e9 K2 _, A# t$ m Example 8:Glider GIF 动图展现(Python)
u! t. a$ ? T( I
& G! N; @) t# {3 E Example 9:涡度追踪 GIF 动图展现
& s1 B- x% \- w+ s6 |, @
3 N$ Y- P% u f: X+ S1 v4 @! z