1 Y* d" E8 s4 h: ^ 在我们科研、工作中,将数据完美展现出来尤为重要。
. ]2 D7 i1 r% i! ?6 t, @
数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
& U9 N0 D% z$ A1 F
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
" r% X* T* w% H! G2 \6 s* ]
Example 1 :散点图、密度图(Python)
0 X7 A4 X: O5 g) S7 @+ J9 u
import numpy as np
" ]+ k% ^3 ]( w' v5 s& i/ p import matplotlib.pyplot as plt
) c0 d, N G& n; `+ e, y* V
# 创建随机数
4 h" v& f1 M: P' d
n = 100000
5 ?# G6 O6 K" Q
x = np.random.randn(n)
3 R+ i1 S1 {3 l0 Q# U7 S
y = (1.5 * x) + np.random.randn(n)
/ r$ f* D: _, X' P) u! d
fig1 = plt.figure()
2 E7 V* z# I8 [
plt.plot(x,y,.r)
6 |5 L# A. e& }
plt.xlabel(x)
1 l: y/ W7 M# h- Y; {) \0 v, k plt.ylabel(y)
* a6 U, ]* q6 i$ y, { e( [: H
plt.savefig(2D_1V1.png,dpi=600)
; [5 `% r, _% q" S& f& A( B
nbins = 200
/ c% `* s% D! S9 C3 H8 W H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
" q& }$ S" x' v8 [1 d # H needs to be rotated and flipped
2 D& M' `$ L4 t H = np.rot90(H)
( z/ L- `$ y2 p
H = np.flipud(H)
, z1 c {- ^' g; A
# 将zeros mask
) u1 z. U' q7 x, d3 L
Hmasked = np.ma.masked_where(H==0,H)
& N3 Y1 D. ~% z% h7 ? # Plot 2D histogram using pcolor
# i$ z- l! a' c* d. t8 y3 N
fig2 = plt.figure()
4 j* X: J: i, h4 W* A4 j0 N plt.pcolormesh(xedges,yedges,Hmasked)
" s) W' o4 N" {- {' B$ u. X
plt.xlabel(x)
. t {- F% A: V$ L. n$ ~ plt.ylabel(y)
8 z* L8 h( T/ J/ a4 }7 g- R- d6 s cbar = plt.colorbar()
* U$ _/ r2 Z, W, K4 Y* C
cbar.ax.set_ylabel(Counts)
0 N0 }* V' r S6 D J K L4 g! n8 U% ` plt.savefig(2D_2V1.png,dpi=600)
5 F4 w" r! d+ J2 g4 U plt.show()
) D4 {$ K* e9 E# a. _" u
/ c8 o% m/ X+ g! u ) l# u6 |0 C0 |
打开凤凰新闻,查看更多高清图片
5 m0 B+ l/ u6 {1 P" m$ D+ i9 K8 K: ]
" e6 C3 M/ E2 D3 Y, X3 z
2 i8 Z" a5 B* d0 N 
: {8 E% F$ _, @3 f
Example 2 :双Y轴(Python)
d- J: a8 a( R, ?: h. w
import csv
% a) R6 j2 W x/ n: K7 i import pandas as pd
& N1 R* Y( M# \' O0 d3 h import matplotlib.pyplot as plt
6 T0 e) H6 F7 F1 {+ k G from datetime import datetime
0 W) d% Z3 x2 @) H! k7 |+ ]
data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
$ Q6 l# g) z/ g) ]- {, A% x* b, @8 \' w2 b
time=data[date [AST]]
2 _( h7 L0 v0 p2 G4 w# U* I sal=data[salinity]
9 Q, ~0 i: _5 G! E tem=data[temperature [C]]
8 o# Z P- y! i( M: g, c5 ^ print(sal)
: k; X# L' D2 Z! o; ]( U' { DAT = []
3 g9 `2 E' ^* D ^) d. T; p2 }6 U
for row in time:
& k9 h1 Y/ }5 G- n' Z6 U! @+ k DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
3 u; E% Z4 x( B4 \ #create figure
; t% [+ f- u2 ?9 {
fig, ax =plt.subplots(1)
& n# _7 l% Q3 l6 }3 [3 M
# Plot y1 vs x in blue on the left vertical axis.
, `' p6 g6 Q4 _$ t, v! X plt.xlabel("Date [AST]")
3 M; y8 z8 u8 l* O( p plt.ylabel("Temperature [C]", color="b")
; L; l9 Y, O4 o2 ~. a plt.tick_params(axis="y", labelcolor="b")
5 k6 Q/ A5 j5 ]/ t plt.plot(DAT, tem, "b-", linewidth=1)
, P! p0 W* G3 H; A0 q8 ] plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
$ G: B- {) ]" ] fig.autofmt_xdate(rotation=50)
! g* l2 z' r$ k
# Plot y2 vs x in red on the right vertical axis.
/ ~; m& K+ A$ o plt.twinx()
2 x& K/ z7 |& ~1 J0 b: m- V+ W
plt.ylabel("Salinity", color="r")
" {7 _9 W7 G! X plt.tick_params(axis="y", labelcolor="r")
9 ~- e/ R$ p, t, d: G: Q plt.plot(DAT, sal, "r-", linewidth=1)
9 w7 M) w! j; U
#To save your graph
+ j, L o5 d5 |0 S plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
k# }7 x9 R% @. p4 l. H plt.show()
4 J" N# P2 T0 o# n0 M# i

: o8 j# O" x* }3 K* r& @1 a! x Example 3:拟合曲线(Python)
$ W- b0 [) Y0 p" u6 N import csv
2 }9 k0 T1 M | C* Q' g
import numpy as np
9 n- @1 N! T- o) L6 J' R
import pandas as pd
* ?4 _& r% |! Q1 P) B1 } from datetime import datetime
/ o0 R4 x, X- L9 ^( Q/ l
import matplotlib.pyplot as plt
( z7 {! E. e7 K# M9 C5 ^# m+ F8 K( b import scipy.signal as signal
$ f+ a* W! h w) ?1 T. L1 y5 F
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
- n5 Y4 z% \% f6 U time=data[date [AST]]
; j6 U( \# X) \
temp=data[temperature [C]]
1 w+ |7 c. J7 X7 q I( o5 n$ e: d1 { datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
" E# N; k2 i; j, c DATE,decday = [],[]
6 G: E' s. K4 T6 x
for row in time:
& B! s; k. A7 N; j: s* C
daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
: L( t& _' Z) L- o% B. J& q- P DATE.append(daterow)
; g$ j8 N6 C' m/ |, q0 q
decday.append((daterow-datestart).total_seconds()/(3600*24))
; r! y% R l, G) H' h # First, design the Buterworth filter
' F1 \5 g Y/ }& o5 V' F N = 2 # Filter order
, e+ ?& C% `. }. ~2 N
Wn = 0.01 # Cutoff frequency
/ M5 H# |: R; S: v: u( z! M
B, A = signal.butter(N, Wn, output=ba)
# c. J5 X2 p' ?- ^! ~ # Second, apply the filter
& S& K* U; {! O1 Y
tempf = signal.filtfilt(B,A, temp)
. n9 V! j- m$ ^; V( u # Make plots
# p. h9 p$ } v/ W$ O. [ fig = plt.figure()
- S# U+ j4 V% b7 a7 y ax1 = fig.add_subplot(211)
4 X! L- N5 t" _) n b6 f) Q1 `; u( ~
plt.plot(decday,temp, b-)
7 i/ Z7 ]7 ]$ `8 h
plt.plot(decday,tempf, r-,linewidth=2)
- ~- Q& _/ E* X& G5 `4 Y: B plt.ylabel("Temperature (oC)")
; r, g. [' u F. b0 v2 n
plt.legend([Original,Filtered])
' \- N; f3 l/ q# L1 ^8 ? plt.title("Temperature from LOBO (Halifax, Canada)")
! K5 x, Y p& B, T6 P# |% z8 @4 e ax1.axes.get_xaxis().set_visible(False)
& t2 G2 w/ X% B8 }- A; C ax1 = fig.add_subplot(212)
+ C% S; R3 T, M2 j" v* i plt.plot(decday,temp-tempf, b-)
) I& g- J' j1 q% j: b, } plt.ylabel("Temperature (oC)")
# Q0 Q1 p8 J' M7 X9 Y. t plt.xlabel("Date")
6 s3 [% @7 _5 V% t+ M
plt.legend([Residuals])
2 a% m) v7 a% a3 z2 M plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
3 w, h/ e. s. ]) m plt.show()
4 ]) s! W. Y# L, j% L0 T 
' D! z! I/ M8 K; G Example 4:三维地形(Python)
+ t; A( O6 T& Q8 R
# This import registers the 3D projection
, @. Q# s) a5 b5 ]6 V from mpl_toolkits.mplot3d import Axes3D
5 S# Y) o0 C q/ @) B1 b2 w
from matplotlib import cbook
8 m% G; n4 f. x" {4 M, w. q from matplotlib import cm
$ w/ b$ o" j, m! | from matplotlib.colors import LightSource
+ X4 I; E; v. Y% }# e
import matplotlib.pyplot as plt
3 U# F' u7 L* }$ V- Z* }! X& k; @
import numpy as np
) Q2 M6 n% a r- c6 [( w filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
7 h; w" a9 K5 i" }. e! t with np.load(filename) as dem:
0 O4 T/ L* K4 k1 B# w9 k z = dem[elevation]
- C4 W5 P. v7 v9 g7 p
nrows, ncols = z.shape
- `, L) X0 H' H3 [$ I- ` x = np.linspace(dem[xmin], dem[xmax], ncols)
( q' J9 B! j. P0 m% P" O1 y8 d y = np.linspace(dem[ymin], dem[ymax], nrows)
/ E4 n. `, a: B- s( ]' E/ R x, y = np.meshgrid(x, y)
, Z9 a$ b# J# M3 z5 b2 W/ F- g8 Z
region = np.s_[5:50, 5:50]
2 @4 p u i* `8 F3 x, n
x, y, z = x[region], y[region], z[region]
/ Z5 K; M. w! C5 N fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
: \# \3 h" Q( w. U
ls = LightSource(270, 45)
6 w4 N- }$ e8 @3 S, ]. ?# d rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
- U) Y' V( }( ^% v( k9 l! i; r# Q
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
- ^% T8 Y& Q( Z9 z4 L
linewidth=0, antialiased=False, shade=False)
8 t% u, ^/ R+ Z& Y
plt.savefig(example4.png,dpi=600, bbox_inches=tight)
O$ G7 f+ V! v) U- u# R5 \7 i# K" m plt.show()
# D; x5 a `- F3 p3 Z2 R
- ]& h3 s5 d1 U/ n2 [ Example 5:三维地形,包含投影(Python)
3 ?2 I$ L e# b. Z0 n+ `
@- ~! K# `- C, v: u7 M
Example 6:切片,多维数据同时展现(Python)
) C7 S- {5 D9 o' B" I" v2 @. x% i
1 ^" J) G7 p Q( d8 P. J Example 7:SSH GIF 动图展现(Matlab)
2 s+ p1 A) t9 n" E1 w+ A
3 K7 t( t/ w+ N( L1 o- m* ]
Example 8:Glider GIF 动图展现(Python)
# r7 o4 `% d2 R0 Y/ c1 `0 e D
0 A4 @! W& g5 p1 j' P! G! e Example 9:涡度追踪 GIF 动图展现
1 @7 K( R4 O& E5 d 9 F/ {- }+ w( |$ u1 @' l0 k