/ i9 }2 s) i+ l- s% l 在我们科研、工作中,将数据完美展现出来尤为重要。
- k" K S" ]& O$ p$ ^3 H* E 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
9 t" [# R* y+ d0 s
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
* M" g8 H+ R2 I. a( F
Example 1 :散点图、密度图(Python)
, }( `( X! ~3 M8 q" e import numpy as np
4 z8 y, @! \! P: d/ X
import matplotlib.pyplot as plt
, L$ v' z9 _, M7 [6 J' _. b8 j5 f8 G
# 创建随机数
% y% x, [- E' P# q n = 100000
2 c+ @( h# G9 y: q4 w ]5 o x = np.random.randn(n)
4 k5 A, ~! A! X& W y = (1.5 * x) + np.random.randn(n)
- {5 @2 ?% h: W# ~* y" U) Q
fig1 = plt.figure()
$ [# D, }: v1 h! M9 g# p plt.plot(x,y,.r)
1 s7 ~! ~9 _" }; c; Q3 ?1 W. {; e( W plt.xlabel(x)
- q* l) ~1 _- l, _6 h4 y plt.ylabel(y)
+ t- Z+ }* Y A8 M2 X$ v6 V plt.savefig(2D_1V1.png,dpi=600)
0 p7 m+ b: d% w2 h
nbins = 200
5 Q7 r: y+ P' [# X4 Q H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
' V% K |9 c' g6 F- _: _% K2 W: n
# H needs to be rotated and flipped
4 g o H M4 H7 i& t H = np.rot90(H)
' u# Y; p# O; s' u ~
H = np.flipud(H)
8 X( l& R% |, t+ P( @
# 将zeros mask
# B+ g8 }+ Z* Y. b8 ~# c% f$ W Hmasked = np.ma.masked_where(H==0,H)
' F1 S" z, m) |' f( i' F E # Plot 2D histogram using pcolor
8 O1 `- b+ d+ {% k1 O) u
fig2 = plt.figure()
7 |+ H" v1 Y- ]
plt.pcolormesh(xedges,yedges,Hmasked)
1 ^1 J8 Z8 }0 m1 `5 i4 S1 V plt.xlabel(x)
& Y4 o# m1 k# ?
plt.ylabel(y)
, z8 S8 R3 C o' X/ x: O; v cbar = plt.colorbar()
* a* u8 B: B1 r0 |" m( p cbar.ax.set_ylabel(Counts)
* N0 j( K# O* | ?+ h' M0 O
plt.savefig(2D_2V1.png,dpi=600)
& d! a5 S- {8 I: w& B# W$ ~- n5 {9 z
plt.show()
: p' q2 @ u+ T
% e0 ~6 K2 I( K" U/ E% h3 { . L2 f0 n9 L# S0 E' U
打开凤凰新闻,查看更多高清图片
( B6 y- y/ g: H/ ?& G
# c% H' E/ W3 b$ m9 E% N2 p
7 _: w3 L$ ?3 F 
. K: X' I' A# n- j. @
Example 2 :双Y轴(Python)
; O0 G c' T( h2 N# N! J( K import csv
: ~+ [9 L2 a( z
import pandas as pd
7 J W, ~6 x' h2 W* F8 ~4 Y import matplotlib.pyplot as plt
7 @3 z7 V4 J1 I8 I
from datetime import datetime
5 X6 V8 @" e& b7 \
data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
. K4 Y B @- { c0 O6 H time=data[date [AST]]
6 W/ C+ f; c6 H+ f
sal=data[salinity]
4 a# I/ N+ p6 K& y& q$ w
tem=data[temperature [C]]
* i7 ]% k; N$ d6 u3 q0 r
print(sal)
+ h; T* e- U) H/ f% V: D0 `" A DAT = []
" k0 x2 w. i3 z& W1 o j. k3 J
for row in time:
$ _# ], \% W0 _8 u" N" y2 i: s4 E3 d DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
; j" e# Z1 U. F1 t
#create figure
7 T- e& Y7 ]0 V2 B" y. I% {$ x- v; J
fig, ax =plt.subplots(1)
" R" a. p, ?8 x7 f1 E
# Plot y1 vs x in blue on the left vertical axis.
. x0 P& z1 t- l# G( v. {0 N- | plt.xlabel("Date [AST]")
0 ^( h" J) \; Y$ o3 C) v plt.ylabel("Temperature [C]", color="b")
: l% V. F/ v) r) Z/ k
plt.tick_params(axis="y", labelcolor="b")
1 k( z) e$ k S# w* D! H6 |5 x plt.plot(DAT, tem, "b-", linewidth=1)
6 c6 D: @7 J! S. q+ n- ]6 F
plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
% L: D$ L, q8 C& M+ [
fig.autofmt_xdate(rotation=50)
g( b" F3 ^' g+ ?9 { # Plot y2 vs x in red on the right vertical axis.
( u* ?- w6 s& ^
plt.twinx()
$ T9 m* p! e' `. ]/ N3 M plt.ylabel("Salinity", color="r")
! _, ~' |( l, e' D V# f+ B& ]8 { plt.tick_params(axis="y", labelcolor="r")
% b) m* O \/ \' a( W plt.plot(DAT, sal, "r-", linewidth=1)
9 _; C: _( m7 u! v3 Q
#To save your graph
0 g9 Y7 d3 a, m, V) \ plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
: ] ~5 F0 G! q# H
plt.show()
5 m. ^0 A+ I0 B# X6 ` 
) U2 y& H3 [1 N, z+ ]3 D6 k Example 3:拟合曲线(Python)
# ?2 n, o( }' @0 `" [: J
import csv
5 x- {% Y2 N, [* o; x# O0 m' n import numpy as np
* L2 W6 }- c; H, R0 A3 k
import pandas as pd
' x# |& L' h8 v$ M from datetime import datetime
' `' @3 p5 R3 e! ~ import matplotlib.pyplot as plt
% v* ]1 v6 N1 _3 a* g
import scipy.signal as signal
6 ~& r/ O# @) v; U data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
: B" }* P" D/ ?# p4 S( K
time=data[date [AST]]
2 ^. w) Q; P, @ o* a temp=data[temperature [C]]
e/ ?3 _* p I3 @* [2 d9 K
datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
- O3 M% v5 x3 l' v0 w/ i DATE,decday = [],[]
, b+ y# V- l3 t4 M! j
for row in time:
+ l5 D8 S3 @3 o3 z. p9 I+ V T6 {' N; o daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
4 _" ]( j( v |! s5 O2 ?2 d) v DATE.append(daterow)
2 z5 D p2 ]& \4 o" U
decday.append((daterow-datestart).total_seconds()/(3600*24))
; n5 b% T+ E, x# l
# First, design the Buterworth filter
$ B# Q! g6 X7 j: M; N% v4 c4 [
N = 2 # Filter order
+ {8 ?0 k4 C* b+ ^: B& o3 { Wn = 0.01 # Cutoff frequency
+ n' _/ c8 K9 k( }% z$ r3 h6 W9 L
B, A = signal.butter(N, Wn, output=ba)
+ {/ p( u* V2 Y6 N1 g # Second, apply the filter
4 o0 g9 F/ l, G8 W* w
tempf = signal.filtfilt(B,A, temp)
& E! }! J* b3 X0 Q2 M2 n # Make plots
6 h% @: V; P$ \
fig = plt.figure()
* e# r& C3 ~% z8 P6 S* I1 V2 o ax1 = fig.add_subplot(211)
, ]# J0 ]0 l: C N1 R plt.plot(decday,temp, b-)
( y; [# r0 E! R: ~1 E6 \7 R; p
plt.plot(decday,tempf, r-,linewidth=2)
0 ~1 m) I; h! k# g- M
plt.ylabel("Temperature (oC)")
* i4 B! }$ U( Y
plt.legend([Original,Filtered])
+ o0 Z/ \5 B" m0 ]8 h2 b" J4 | plt.title("Temperature from LOBO (Halifax, Canada)")
% M. m G) `! I! i' T ax1.axes.get_xaxis().set_visible(False)
7 v% \" B6 q+ _9 R" D1 X- S
ax1 = fig.add_subplot(212)
. d+ Z+ K9 Z1 ]1 f0 v% Y0 P; S$ G plt.plot(decday,temp-tempf, b-)
* l% Y& u" X6 S0 s+ T) B. c, } plt.ylabel("Temperature (oC)")
: Y; p6 j. O2 x plt.xlabel("Date")
' d. w6 X' g+ w* \6 Y plt.legend([Residuals])
8 P1 W4 K6 M ~
plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
+ r8 M: s3 [) L% g* J# G8 v
plt.show()
/ {6 e2 q" s( O# s8 t 
* b2 f( z* K) l- ^ Example 4:三维地形(Python)
3 a/ a) Q3 E' ^- A# h: l
# This import registers the 3D projection
3 J! F, y! }0 K2 Q: O: s
from mpl_toolkits.mplot3d import Axes3D
. }1 d. J' p/ p- E F" {1 O from matplotlib import cbook
/ l7 ^; N) R* q/ @+ l2 `2 D
from matplotlib import cm
' z: ?3 F* R% f# ^9 W6 T+ x from matplotlib.colors import LightSource
3 F" p$ ^0 U# S# G* c2 v
import matplotlib.pyplot as plt
$ J' `4 |: U- e, [
import numpy as np
9 m6 V3 u1 @! g7 h: E5 ^7 u1 `9 k filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
8 p, x4 S. C3 o& e! h/ ~6 u5 m with np.load(filename) as dem:
/ {$ H5 y% N* K3 @
z = dem[elevation]
! F, V; l5 x! x; q
nrows, ncols = z.shape
0 e6 j# {/ p! {+ W% v$ h( E x = np.linspace(dem[xmin], dem[xmax], ncols)
" b. N7 c/ _, t) S0 {2 n1 | Y
y = np.linspace(dem[ymin], dem[ymax], nrows)
$ m( i' m1 ?, g( M% t# ~ x, y = np.meshgrid(x, y)
8 q% z+ R6 S: l" A' M8 x$ W
region = np.s_[5:50, 5:50]
* q! [* ^! d$ Y% w7 _9 M. C x, y, z = x[region], y[region], z[region]
" k7 T8 d3 l% ^9 g6 e fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
1 i) f0 E. ^4 ]$ T
ls = LightSource(270, 45)
3 Z0 U9 {5 Q5 {; P0 {2 g" y8 l" M rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
+ O5 W! _' Z$ V3 Q, Q
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
# O2 ? X$ t- w9 {' W n
linewidth=0, antialiased=False, shade=False)
: _/ X( i( u0 u1 C9 h) q) f
plt.savefig(example4.png,dpi=600, bbox_inches=tight)
: f; O% O U9 V% j
plt.show()
( S' M- ?; z2 N* Q/ ~
2 S7 l% a/ @. u1 w8 L* _/ g* p Example 5:三维地形,包含投影(Python)
5 Y7 O. Z. u; d$ ]
6 k1 ]7 |+ m* e# L/ r1 W2 C Example 6:切片,多维数据同时展现(Python)
+ V, X0 Q7 [( h
, Y4 P9 }: C$ D+ g" k Example 7:SSH GIF 动图展现(Matlab)
; V+ N6 C3 T4 s& h/ J
# D( V3 \/ H3 _2 X, ?) y3 Y Example 8:Glider GIF 动图展现(Python)
1 ^3 A9 P, _1 ^$ i 7 c+ C9 B6 N" u' h8 c6 L
Example 9:涡度追踪 GIF 动图展现
4 K5 f. ]5 k* ~' ]0 o2 A6 E; R( T
' f! b, T, j6 U" ], d+ e