% E9 p; l. } {$ u! h
在我们科研、工作中,将数据完美展现出来尤为重要。
, t: C- `7 C2 M5 b 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
9 ~% u8 ~6 \" j$ l
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
; r. a" T. \" P8 i* r% e! R( C
Example 1 :散点图、密度图(Python)
" j$ z. L, q5 v/ g: D. s# T import numpy as np
' p5 y( i& R. f t' K+ ` import matplotlib.pyplot as plt
/ n1 c* E J; o. X* U, P
# 创建随机数
$ W9 t0 i1 v' }! }- R
n = 100000
- n' ]3 q7 ?) w" ~/ C3 T' V
x = np.random.randn(n)
U( Y1 e8 l# ?: v3 s* ^5 n7 u y = (1.5 * x) + np.random.randn(n)
& A, U$ Z7 ~/ X1 ? fig1 = plt.figure()
$ l* T% t8 A' o4 D0 c
plt.plot(x,y,.r)
) h7 f- H) A& _! T! p$ U' f
plt.xlabel(x)
8 v9 O# Q& b! ~' r2 B- w plt.ylabel(y)
$ u, P) v( c( z; ^ plt.savefig(2D_1V1.png,dpi=600)
1 I" V7 ?* D9 S% ^2 D3 \
nbins = 200
6 z" o) b+ B$ b9 w" z3 y H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
- d: D4 F5 m2 T8 _0 w # H needs to be rotated and flipped
9 [+ v! s0 f1 ^ H = np.rot90(H)
- q! l2 V9 `+ i
H = np.flipud(H)
8 B" F7 o' @5 b
# 将zeros mask
3 i2 c1 T2 Z' C4 |
Hmasked = np.ma.masked_where(H==0,H)
6 C9 G0 O# J1 a6 R! _$ H
# Plot 2D histogram using pcolor
4 K- y7 x# C% d4 r3 W; R
fig2 = plt.figure()
% B G8 x% E! u# _ plt.pcolormesh(xedges,yedges,Hmasked)
6 U! w) t; |: x* L plt.xlabel(x)
* m0 z7 j7 G6 r! m plt.ylabel(y)
% n& k! g) k. A cbar = plt.colorbar()
* C2 X6 A) `/ F cbar.ax.set_ylabel(Counts)
0 Y+ `3 h- U+ I8 J7 u3 O
plt.savefig(2D_2V1.png,dpi=600)
" t+ o4 ?# @2 `" X3 W5 C
plt.show()
2 T U w) K7 q; b Y+ s
( a4 {1 A [! Y: Y7 e6 _) F 9 S* R8 t, r' H0 m2 w% D* c
打开凤凰新闻,查看更多高清图片
% U% T# V7 L3 p; ?# Z( D6 N9 x
" C" \$ C0 ~; a1 T& P3 _
" N' T+ s0 P, K- h5 c) J3 A' u 
" u- @5 ]4 ]: m: [& h8 ~; {
Example 2 :双Y轴(Python)
$ T9 y8 ?/ H- _' g* Z7 T import csv
: E0 w Z* s: D8 n- S import pandas as pd
1 v5 _7 k# ^( s* ]2 f6 o
import matplotlib.pyplot as plt
/ a" _. _+ E6 P3 b& z
from datetime import datetime
& I8 h) ?2 |1 f i3 o; T0 x data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
9 b! @! h, M" E1 s6 J0 U" s B' B time=data[date [AST]]
3 \- b' i. P6 K7 |9 h sal=data[salinity]
m2 Y2 L% b2 w( D9 k: \6 L8 c) ] tem=data[temperature [C]]
/ p: U7 _6 u; q
print(sal)
1 E3 I7 |& p l5 _3 R* x, J/ C
DAT = []
6 k. s" n X' g- T8 @ for row in time:
; Z& X8 F" {0 j: a1 z- h, D1 {
DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
( K" L) ?- i" [+ p+ c! ?. E$ N
#create figure
g- i+ Y* }* p# J( C fig, ax =plt.subplots(1)
. N6 l8 J' ^4 I1 w5 S1 ^, L # Plot y1 vs x in blue on the left vertical axis.
4 s# X X3 D$ p8 L; N
plt.xlabel("Date [AST]")
+ z, {5 [+ N3 B4 d, ^& Y
plt.ylabel("Temperature [C]", color="b")
2 r+ F. ~; O& ?0 G7 w J plt.tick_params(axis="y", labelcolor="b")
( m0 |7 w& G+ q+ z( x plt.plot(DAT, tem, "b-", linewidth=1)
6 Q: l6 v0 A: K
plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
) ~# n$ d% P0 E8 R6 D0 ?4 E9 p
fig.autofmt_xdate(rotation=50)
6 S1 g% |$ ~/ _0 Q9 R
# Plot y2 vs x in red on the right vertical axis.
, ]2 j- A, D2 \ plt.twinx()
% F! w2 T* {8 r @, S plt.ylabel("Salinity", color="r")
! w8 V6 ?' e2 A1 m; m2 {& V0 @# { plt.tick_params(axis="y", labelcolor="r")
' o. s( b3 I- `- s. R1 t
plt.plot(DAT, sal, "r-", linewidth=1)
) w9 {; g+ d) P, S* `: L' U; T #To save your graph
9 p0 W9 c2 I# k" p8 L# S- C1 X* P plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
$ S) a% l3 \; C; w, Z- W5 v plt.show()
, O+ `( b) R8 w 
9 \2 Z# V& p) l1 f" F$ ?$ h
Example 3:拟合曲线(Python)
* ?; z9 |2 s5 k# e( f
import csv
8 e* t! R s& L$ C! y* F import numpy as np
6 w, N* w2 s2 h1 ]- q import pandas as pd
6 d" `+ P* F0 p, t X8 ^7 K3 r9 }
from datetime import datetime
* B$ C5 C' C" t4 i' E& O" D( n" L
import matplotlib.pyplot as plt
! j) K% q8 |( U. Y import scipy.signal as signal
, Z1 |6 w- `7 e X! M
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
6 F" t' F5 Z% q5 O, F
time=data[date [AST]]
7 G3 l# R8 b4 e4 a5 D temp=data[temperature [C]]
6 `% K5 Y8 z+ C4 @ datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
& d# k( v8 _; w& g DATE,decday = [],[]
6 A. U( p" p, z5 F for row in time:
7 W E# z- i8 A. c. j3 G3 e: [( T
daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
$ q( {0 K, \! ^7 K0 l4 p
DATE.append(daterow)
# }: z3 |' O0 w/ Q# S' q" R decday.append((daterow-datestart).total_seconds()/(3600*24))
3 g9 X4 j+ ]/ _$ I # First, design the Buterworth filter
- z6 Y2 L" r, o* ^% h N = 2 # Filter order
6 l$ c3 J7 `8 S: R( t
Wn = 0.01 # Cutoff frequency
" O8 y! c) f! t) Q# C# w" B- f B, A = signal.butter(N, Wn, output=ba)
' C1 n; w6 X2 K2 { # Second, apply the filter
: T' r8 d$ w2 J5 i7 @
tempf = signal.filtfilt(B,A, temp)
2 c3 W( j4 K, W, G9 k # Make plots
8 t3 f! F+ \0 v' P5 \8 l fig = plt.figure()
; f4 b+ v; M+ s' v& t3 \1 f ax1 = fig.add_subplot(211)
+ d. R* P' D0 Q
plt.plot(decday,temp, b-)
& ~) h) Y6 J( y0 q3 E plt.plot(decday,tempf, r-,linewidth=2)
5 m/ }8 k& w3 b0 {5 w! @( |" q
plt.ylabel("Temperature (oC)")
# m2 E4 _5 R+ b$ o plt.legend([Original,Filtered])
# Y5 M: G( U+ K7 ], K, c plt.title("Temperature from LOBO (Halifax, Canada)")
! q* o$ C0 U4 r9 @ ax1.axes.get_xaxis().set_visible(False)
) P! a! B3 v5 v q$ h+ f4 X' r2 ~
ax1 = fig.add_subplot(212)
) e; a& u& S$ I plt.plot(decday,temp-tempf, b-)
3 F' U; P' s) f' \
plt.ylabel("Temperature (oC)")
6 e A' a t# e plt.xlabel("Date")
4 I5 l* g! E: h( }, L6 |- d
plt.legend([Residuals])
. h/ P$ W$ K4 ~8 P, [ plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
7 o/ x$ u6 J, d( K: C6 H
plt.show()
; C. b6 ~ S; \8 @/ E 
, O0 Y0 [! ~3 ?6 L: e Example 4:三维地形(Python)
' }6 e4 G9 G) l8 j # This import registers the 3D projection
- r3 D2 P& A3 {0 L- c from mpl_toolkits.mplot3d import Axes3D
! [/ U; ?5 I) T/ c' r6 O6 Z4 c
from matplotlib import cbook
/ U6 K' \- s6 U( Z. G: Z
from matplotlib import cm
' D$ i4 {; u/ U; r
from matplotlib.colors import LightSource
& R/ F! C3 G7 o& w$ W+ l import matplotlib.pyplot as plt
8 }7 R' J/ {: R
import numpy as np
, E' O' u* ~' c+ K/ \ _7 f
filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
: A4 v+ d4 S5 h _! }3 o
with np.load(filename) as dem:
4 f: k1 E( S3 o. R z = dem[elevation]
" i& I) {7 o6 `! T/ Q nrows, ncols = z.shape
+ [$ G' [; D5 V: o8 ^
x = np.linspace(dem[xmin], dem[xmax], ncols)
) Q- X+ O) ?, L7 x2 r7 c y = np.linspace(dem[ymin], dem[ymax], nrows)
1 i! N: g2 a A2 L6 Z! y3 }+ B L5 R x, y = np.meshgrid(x, y)
2 Z f% I# A7 ?4 f% Z- s7 ^
region = np.s_[5:50, 5:50]
j/ d/ x& z3 N! ? O; j x, y, z = x[region], y[region], z[region]
) f5 \7 I# E. J4 O
fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
: [* {/ t% V" M- Q, w! ^
ls = LightSource(270, 45)
8 W4 a% _3 L. X
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
h1 J( a3 S4 g3 H surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
7 T% t" ~! q. q5 @# ]3 O7 y linewidth=0, antialiased=False, shade=False)
8 I6 K X' Z: v) Q* K: M
plt.savefig(example4.png,dpi=600, bbox_inches=tight)
6 U8 s2 ~& l z% l
plt.show()
0 {7 ]7 t/ q6 o; A0 q. X 7 k9 k5 u& f. e! k. w0 U
Example 5:三维地形,包含投影(Python)
) x. M$ a$ \% H
$ e8 y% M- p. ?) }2 [ Example 6:切片,多维数据同时展现(Python)
. ] P8 f& w$ ^6 k! `+ q8 l ( i- q! n- o, y6 Z& R$ O5 g" k
Example 7:SSH GIF 动图展现(Matlab)
7 { }2 f9 u5 n ; Y9 d; _- a0 h" w b" G
Example 8:Glider GIF 动图展现(Python)
/ L! q7 f1 [7 T0 v
* y! }" v3 U8 P# k. B
Example 9:涡度追踪 GIF 动图展现
" ~% k% x" U$ q+ i( p
: M. o4 P7 s7 X8 F