0 O$ j- h# J- l) G( w 在我们科研、工作中,将数据完美展现出来尤为重要。
# M- S+ X/ b0 F, F9 s2 z3 l 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
% M* N1 w: K7 L! }( j 下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
2 r0 P7 J) T" D& p+ _& M O* j
Example 1 :散点图、密度图(Python)
+ N0 x1 F5 Q9 L Z" F
import numpy as np
9 x2 z. {3 {. N; w import matplotlib.pyplot as plt
6 S1 U4 R9 G9 v& t$ k2 T; q # 创建随机数
& k( }" Q; O# \' \9 v2 M5 H0 Y1 j n = 100000
. N( D& Y2 x9 S( t1 E8 @
x = np.random.randn(n)
8 A. I; ^( M K. A' ?( T' A3 @
y = (1.5 * x) + np.random.randn(n)
9 }' ~% v# N* }0 e; q fig1 = plt.figure()
' _0 d+ r8 T! S4 N5 }. p T$ `
plt.plot(x,y,.r)
) o( ?7 Q0 a. d1 l6 ^" b
plt.xlabel(x)
5 A, t5 C4 V, H, f4 m plt.ylabel(y)
; c3 [0 O5 T5 [$ Q+ y plt.savefig(2D_1V1.png,dpi=600)
6 S9 P' J, u- f. r! U& v9 d) B" M( | nbins = 200
* S9 S- q& S* |9 o- @1 O" T
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
; p. s+ V/ U/ z+ s) ?% m( n3 D
# H needs to be rotated and flipped
$ R% s; A* Z: v H = np.rot90(H)
( ^+ p# e: t4 G" m
H = np.flipud(H)
6 W# S1 S7 e; y- ^8 w0 Q: X # 将zeros mask
7 b5 h! Y6 D6 s$ p
Hmasked = np.ma.masked_where(H==0,H)
# `- a7 V) S8 }7 ` n1 T Z! x # Plot 2D histogram using pcolor
" i8 f$ C/ P/ j, _" t9 K# ?
fig2 = plt.figure()
. ]& R5 t" F; F0 _5 T plt.pcolormesh(xedges,yedges,Hmasked)
6 ^" h7 Q1 E6 w% i6 f! Y4 @
plt.xlabel(x)
6 _! E& F# \; m9 H( C2 |1 D' m+ d
plt.ylabel(y)
# R- A! P: C' U$ _ cbar = plt.colorbar()
1 L4 I" }/ _1 u( M4 U0 W, H cbar.ax.set_ylabel(Counts)
3 ~, E5 s' t- ? plt.savefig(2D_2V1.png,dpi=600)
0 T. X5 m ?2 {1 G# p plt.show()
# P; g- M! V6 C0 B: R, K
% u D a; s) g/ t# p' E" E1 U
6 B6 h6 v ]. l: T2 q
打开凤凰新闻,查看更多高清图片
% g4 B- m% F W w
+ T4 l; D3 C* Q. E0 @; F; d$ k l1 N 7 R5 Z& o* k. c3 k! i% j# f/ o

+ n0 c8 W$ O9 [, B# z' n v0 O
Example 2 :双Y轴(Python)
6 A8 ], D2 y7 u, ]/ X1 g4 E
import csv
1 [* c) K: y5 T, M& q) f import pandas as pd
1 Z. D9 K1 j: U7 x import matplotlib.pyplot as plt
; p" ?! P7 H! V4 w4 Z) ^ from datetime import datetime
3 w H0 `6 P6 g4 c0 V7 w0 I data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
; h, M, x) n `6 U time=data[date [AST]]
; t, V. r* j# L. ]: g
sal=data[salinity]
2 @- L& [/ @8 a! |1 Z
tem=data[temperature [C]]
6 q7 r: c! y0 m print(sal)
e3 I0 X, e* I: z DAT = []
6 e+ }5 s6 j( K% S# j/ e for row in time:
* ~( `/ j0 y y0 {
DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
& R1 e Q6 }+ n, b6 q# r #create figure
2 r7 O7 k, E# h; T* l. x
fig, ax =plt.subplots(1)
+ y) b% O& e' f( o* _ # Plot y1 vs x in blue on the left vertical axis.
/ M5 b, {3 X* K& w plt.xlabel("Date [AST]")
# b1 `; i9 e) V4 y plt.ylabel("Temperature [C]", color="b")
- f. m# a: W* b9 s4 m; K' w5 D plt.tick_params(axis="y", labelcolor="b")
' @7 n" y9 M& q, Z' U1 n5 B
plt.plot(DAT, tem, "b-", linewidth=1)
# t9 h4 C8 Q/ B( Z9 P7 X$ b: b
plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
9 M+ z! R2 |. Q5 ^' J fig.autofmt_xdate(rotation=50)
* n. u* i8 U, ` # Plot y2 vs x in red on the right vertical axis.
% o- ^; S# J; H7 i' v6 s/ R plt.twinx()
$ \ y0 ~" u B# b" h4 l plt.ylabel("Salinity", color="r")
5 d7 r8 C: }' A4 _" s7 r
plt.tick_params(axis="y", labelcolor="r")
& F9 {4 _. T5 p plt.plot(DAT, sal, "r-", linewidth=1)
- F! p) C, ^" q) n% L
#To save your graph
/ u" [6 k5 i1 s
plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
" M7 s* V- u/ E. C+ O plt.show()
6 a* i: B! n" b, p7 Y" i

9 I, b0 s% G% }/ M2 q
Example 3:拟合曲线(Python)
' [/ F; Q$ y4 D: v. Z/ u* ~6 L import csv
( A7 Q3 K+ U" n7 z import numpy as np
9 U4 b$ H! I2 M import pandas as pd
% W; y% x1 |. G' t- I
from datetime import datetime
5 Y+ k- a3 w! x/ R7 r; c
import matplotlib.pyplot as plt
( X# M. u; I7 }/ x
import scipy.signal as signal
9 [( w1 \- k& g; t
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
w( ?/ I9 r+ w$ | time=data[date [AST]]
( ]2 A( a3 e: F2 j temp=data[temperature [C]]
3 ~% P: Y3 C+ Y+ x* t3 p6 y
datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
( u, w2 O" y$ l% C& v& ?# R
DATE,decday = [],[]
/ q6 W0 K* I% G) @
for row in time:
+ i/ a8 Z) I d daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
% _) s0 n( F9 y( Y" G DATE.append(daterow)
4 r. \- H/ j7 X9 V# r
decday.append((daterow-datestart).total_seconds()/(3600*24))
: a) L" i. Z* G. o
# First, design the Buterworth filter
X2 g* ]# t/ d% O. s N = 2 # Filter order
4 ], c+ M. e8 _% ?( ?6 H4 i1 r0 y
Wn = 0.01 # Cutoff frequency
6 B/ c7 H" c; ] B, A = signal.butter(N, Wn, output=ba)
0 j/ U6 B, r% z4 ?) Y! p( R # Second, apply the filter
z8 L0 L3 e% Q, `- Q# F6 [% F
tempf = signal.filtfilt(B,A, temp)
' \8 v2 S; e6 p/ r0 E
# Make plots
* c$ i0 Z% Y) J: I5 c$ e
fig = plt.figure()
6 X" s) c/ t( r, h- K, O2 Y" N ax1 = fig.add_subplot(211)
# I; i: O$ n2 \7 O5 X1 R( V) r
plt.plot(decday,temp, b-)
$ J7 c# l: O+ |+ h2 Y' U9 U plt.plot(decday,tempf, r-,linewidth=2)
, Q) | ~( B; U plt.ylabel("Temperature (oC)")
4 q1 Y$ |$ K) u% s" I8 v plt.legend([Original,Filtered])
1 d0 w7 Q9 @1 \
plt.title("Temperature from LOBO (Halifax, Canada)")
/ o% i2 D9 P5 j/ u" U ax1.axes.get_xaxis().set_visible(False)
" P* p0 ^1 u0 P4 E+ ? ax1 = fig.add_subplot(212)
N+ r4 \ E) e plt.plot(decday,temp-tempf, b-)
1 T L( U) @7 d
plt.ylabel("Temperature (oC)")
2 h& \9 T% u+ ? plt.xlabel("Date")
5 o5 T) ?& K6 T2 p- G
plt.legend([Residuals])
4 E- f# ^& W: n9 J- b. W
plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
; \8 D9 \" V2 ]$ r _+ A0 `
plt.show()
, l) Q9 V" m z2 w" O4 _- { 
" ?) @' e6 T) q4 ?
Example 4:三维地形(Python)
" i5 u* N4 \% x: Y8 O; E: h: A # This import registers the 3D projection
/ \& _" |. A7 m' x( W3 u+ Z2 H
from mpl_toolkits.mplot3d import Axes3D
) q, [- Y7 s& n* [ from matplotlib import cbook
4 J( H% J3 x0 A# M' i# Y/ P% W( ]
from matplotlib import cm
( I2 N3 C( b* W6 y' z/ V" w
from matplotlib.colors import LightSource
% m# B$ d1 E2 V& m
import matplotlib.pyplot as plt
0 d7 \! Q( t9 u1 t: V
import numpy as np
3 m( R, M9 S/ L* Z* \
filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
; s$ p: s# v7 r9 {- g with np.load(filename) as dem:
/ k+ I+ s m0 |
z = dem[elevation]
% S/ }$ I+ l' _% e) J* `* j
nrows, ncols = z.shape
/ I! M B, `. p2 { d
x = np.linspace(dem[xmin], dem[xmax], ncols)
" N1 B3 g' c6 S$ C2 T* A y = np.linspace(dem[ymin], dem[ymax], nrows)
5 n) C* p+ l+ ]9 k2 h
x, y = np.meshgrid(x, y)
3 J6 Z. ?0 E/ m5 m' x4 u' f& l
region = np.s_[5:50, 5:50]
5 T- B9 i9 X$ O' D) F: _7 _ x, y, z = x[region], y[region], z[region]
) Y3 _, d1 @5 A+ V
fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
7 ]# P8 B! _! }, T9 \& I ls = LightSource(270, 45)
9 `1 \( Y* }1 C# O: {" _2 P
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
* j0 t+ ?$ g H' O9 ?% I% Y
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
! c$ {- ]4 Y: R* O
linewidth=0, antialiased=False, shade=False)
' }$ o% ?( Y6 p% o( L plt.savefig(example4.png,dpi=600, bbox_inches=tight)
$ M3 h% B, P% Y7 n1 o plt.show()
' E h, f) j6 y5 w& ^4 P& }- n
" B1 G8 {6 F8 H- |) Y' M/ C, U Example 5:三维地形,包含投影(Python)
6 s, Y4 g9 n$ h3 w4 Z4 y; g- f O * r% y0 `; H, w. d% P# x+ F! H! `
Example 6:切片,多维数据同时展现(Python)
% X# E0 K( a( `% [. W
+ {0 n* k2 G b Example 7:SSH GIF 动图展现(Matlab)
( n( ?; d- |1 b, A# t/ o$ e
+ E0 z. V" v9 z/ a0 V, ~; Z; U4 d2 S Example 8:Glider GIF 动图展现(Python)
* q: e6 i! F- P2 R) z& s
6 Y9 ], I1 l& g8 \5 [ Example 9:涡度追踪 GIF 动图展现
% ?$ Q/ ?; {! Y1 k4 I4 K
7 I/ }6 C; \6 n: K. x