1 ]8 u1 n! j% X9 _; c- M' ~ 在我们科研、工作中,将数据完美展现出来尤为重要。
y' S7 n4 _5 m) u+ Y3 x4 W
数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
$ h5 L3 y* K8 }4 Q0 L; C
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
& J' O5 C7 g4 d5 M8 n0 `- Z9 C Example 1 :散点图、密度图(Python)
+ N5 Y4 C# E# W8 i
import numpy as np
& J) L6 k3 M m/ J9 z
import matplotlib.pyplot as plt
5 D z% m3 Q! ~) B1 T/ B. u
# 创建随机数
$ l6 K% A7 ]$ o% m/ Q0 @% L, X/ H n = 100000
/ r6 I* W; I+ z- a5 B. J! d$ |1 a+ ` x = np.random.randn(n)
# F, b. u( G; N* t% m( a, T. l
y = (1.5 * x) + np.random.randn(n)
) p! ^7 F) X" ]$ K, V; r( l fig1 = plt.figure()
; y3 }) ]$ |% ~3 c% w% u9 v( h plt.plot(x,y,.r)
! G0 o* ^- o. g9 M: K. p! H
plt.xlabel(x)
0 z2 ?3 r. O/ P- `7 u L- r plt.ylabel(y)
& X2 H' I+ [$ P5 E$ m9 i plt.savefig(2D_1V1.png,dpi=600)
a4 o; n! Q* q0 d7 |
nbins = 200
1 E9 M3 z6 E( ] u! }2 x3 U H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
?( M/ M J) I1 r9 F, i
# H needs to be rotated and flipped
" e) @- u! A4 j# w0 ^2 i; x n H = np.rot90(H)
+ ^2 F" q4 U Y9 |4 o0 z H = np.flipud(H)
' B/ z) Z0 D( c6 r) ] # 将zeros mask
1 I* v) y, K* ]8 k/ ~$ r Hmasked = np.ma.masked_where(H==0,H)
: r* b! T- Y4 m # Plot 2D histogram using pcolor
5 N; G" e3 z2 G9 I fig2 = plt.figure()
% s4 `: [ Z, M plt.pcolormesh(xedges,yedges,Hmasked)
: A0 v8 B( r/ H7 w5 \. T9 h
plt.xlabel(x)
5 v' x! l1 ^6 ]5 D6 F plt.ylabel(y)
# V3 F' p) _; V. v* S7 U
cbar = plt.colorbar()
+ a9 u1 e6 z/ y# ]
cbar.ax.set_ylabel(Counts)
* J1 k9 Z9 C# I+ c: |3 Q
plt.savefig(2D_2V1.png,dpi=600)
4 x4 U( I/ p* o3 J, L$ k* X
plt.show()
/ X O0 b0 Y4 v* g' l5 j
1 G2 d9 h: O! |- m) I ! u5 C5 m+ U# n9 x5 {
打开凤凰新闻,查看更多高清图片
9 M, [- I2 Y, F# H2 P9 K- q2 m
+ A7 t/ U! n" [4 Y3 H$ P& F- y
2 K# s* C" i) [0 }; p! ^. M( H 
& I6 Q1 M2 U8 H Z
Example 2 :双Y轴(Python)
X# N6 J. n( I( X5 j2 l6 s; g import csv
: K) ?) Y% {4 E& s9 k1 F! m+ o
import pandas as pd
2 V1 H* P: l" H! D7 O2 _0 _
import matplotlib.pyplot as plt
l7 L6 i. Q* s8 X3 Q) U1 u from datetime import datetime
" j# p, K4 l3 Z5 p8 z o7 r/ J
data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
, k' e+ B) R5 R5 g0 v3 c2 @
time=data[date [AST]]
, a' \) M2 Q/ e1 F" K sal=data[salinity]
! Z; I1 T/ g* D5 x) J
tem=data[temperature [C]]
: _! W' ^7 g2 L& g/ _% W
print(sal)
2 e- N7 j- `* F& i( j0 E: U DAT = []
3 y6 S/ e/ I4 Q8 M: ~" f
for row in time:
0 v7 g# P9 d; T; s DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
; k! m& k3 h5 n$ ~ #create figure
' \8 A0 {5 ^' H2 p
fig, ax =plt.subplots(1)
) X% u) d! C0 s" X$ V7 G8 s( m+ u # Plot y1 vs x in blue on the left vertical axis.
8 p# N0 i# u$ T8 z1 X. r
plt.xlabel("Date [AST]")
_# T8 e; w/ v% N3 K
plt.ylabel("Temperature [C]", color="b")
+ W+ M2 K3 c" W3 B
plt.tick_params(axis="y", labelcolor="b")
! i6 I( D6 }& v# O& ~2 b
plt.plot(DAT, tem, "b-", linewidth=1)
H# O" Z1 j( f9 c% m9 p; o plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
6 P7 z1 p3 U- V3 t
fig.autofmt_xdate(rotation=50)
0 u9 z3 z2 ^! u1 f2 \
# Plot y2 vs x in red on the right vertical axis.
/ p4 k: {) z9 w2 s plt.twinx()
7 z, |2 J: d7 J2 r2 p5 }# J, B( H plt.ylabel("Salinity", color="r")
6 m. a( b/ q+ Z plt.tick_params(axis="y", labelcolor="r")
/ q `. r" u# W! } b3 \ plt.plot(DAT, sal, "r-", linewidth=1)
# |. Q. r; P: x) A! Z
#To save your graph
2 N! i+ ]- G+ w plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
; {( \, l( _/ ^# \# V plt.show()
9 @. K/ s8 y- {8 J* u) z$ W! H6 l/ S

, p D2 N8 k3 v; Q* H& K. m
Example 3:拟合曲线(Python)
+ y3 a" n0 @' G import csv
4 f& F- O# ~/ a import numpy as np
^1 U9 y% q& ?
import pandas as pd
4 H! t$ k/ p% V8 w2 m
from datetime import datetime
0 K. g5 E" { K# f- W1 O
import matplotlib.pyplot as plt
' T& m/ d9 N/ d4 S2 h( j: i
import scipy.signal as signal
: {- R4 m z/ A8 B( R, U: U9 M
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
3 M" R% G, ~5 m3 @* `; V9 q time=data[date [AST]]
) p$ N) ^8 A0 t, O
temp=data[temperature [C]]
* `! p& |' @4 p+ J; d datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
. N3 C* E" H& @
DATE,decday = [],[]
: H' Q- @4 p. l. @8 \ f
for row in time:
/ d8 _8 s! l; \+ n6 E# M& Y# f/ r
daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
9 O0 B9 z% Q, y9 i) k% [5 D DATE.append(daterow)
" q3 q2 z+ ?( B* v% ^
decday.append((daterow-datestart).total_seconds()/(3600*24))
; |* N5 e5 ~: b1 {3 \) B& |1 i
# First, design the Buterworth filter
( ]8 g3 y; P9 m; P: k$ M- f& Q N = 2 # Filter order
- a! i, y( b% T9 n& `1 ?% S Wn = 0.01 # Cutoff frequency
7 g6 O5 \3 v7 S7 K% [ B, A = signal.butter(N, Wn, output=ba)
2 D) S7 p+ s- ]
# Second, apply the filter
7 K$ n }7 X$ X# W4 U0 _0 C% m$ t tempf = signal.filtfilt(B,A, temp)
! b$ D& N& e) n& Y # Make plots
" \6 W) r+ N+ K8 L0 h fig = plt.figure()
, H# Q. F( J- F
ax1 = fig.add_subplot(211)
7 \% I# v7 q) i3 w! s
plt.plot(decday,temp, b-)
4 M8 Q8 Z5 X. [8 T0 B! j
plt.plot(decday,tempf, r-,linewidth=2)
. S0 I2 V0 |+ n4 ^( e
plt.ylabel("Temperature (oC)")
& G/ q5 z5 \7 k2 K+ t# @- h plt.legend([Original,Filtered])
7 G9 a" r. d6 ~. Y) E' g! S5 ~
plt.title("Temperature from LOBO (Halifax, Canada)")
; A% L0 J* k- W' a ax1.axes.get_xaxis().set_visible(False)
5 [/ j! p+ x# K3 V4 W, W
ax1 = fig.add_subplot(212)
6 F# z1 j. _" _$ a5 F/ J
plt.plot(decday,temp-tempf, b-)
$ y4 L2 C5 j T1 v! k plt.ylabel("Temperature (oC)")
6 m% O1 _4 ^" D# t z
plt.xlabel("Date")
, |2 J' F* D4 q' v plt.legend([Residuals])
, s( V; `& \6 A: A- o; P
plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
/ `2 x% Q- l. `. Q9 B( c: y; s6 T
plt.show()
6 T$ G7 m; |, G G! E# V 
8 H' H# T+ i, \; ?0 A7 C6 \+ s* k Example 4:三维地形(Python)
. v4 a! n! `/ U+ x3 C4 I |
# This import registers the 3D projection
% U, h: h, [" F( {7 j
from mpl_toolkits.mplot3d import Axes3D
. W U' S6 y5 A+ s9 x
from matplotlib import cbook
. {, r j# ?& Y; J) Y" H6 X. Z
from matplotlib import cm
& }' v2 z0 J. m* q# s
from matplotlib.colors import LightSource
7 ?& b! w" I/ A0 G% u import matplotlib.pyplot as plt
. d- D9 S' P/ l import numpy as np
4 Z) m, E3 G0 x0 g filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
1 {) x$ k' _! E( I @ with np.load(filename) as dem:
( j0 p) Y5 z8 q! P" k/ M' S
z = dem[elevation]
% G" L( j% s3 z% P! C nrows, ncols = z.shape
8 r H; S2 J- F( ] P" V
x = np.linspace(dem[xmin], dem[xmax], ncols)
8 \6 [# ]0 e+ p9 ^: C* K5 |' U
y = np.linspace(dem[ymin], dem[ymax], nrows)
" x h& l# D0 f* @6 d: g
x, y = np.meshgrid(x, y)
( G: d. Z8 c* v: F
region = np.s_[5:50, 5:50]
/ W5 P9 L. @" H- ^; e, X0 h8 S x, y, z = x[region], y[region], z[region]
$ k5 h+ v- z3 r. D. n) f% x
fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
% x/ U/ R5 `2 w" |* j
ls = LightSource(270, 45)
% X# N0 o' y- F# X7 O
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
% o* l$ U6 j! C8 F* ]7 i( s* k e
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
' s8 g. t5 t6 a, I/ }# x linewidth=0, antialiased=False, shade=False)
^( B+ }. k9 P$ c; o1 o; h- h0 }
plt.savefig(example4.png,dpi=600, bbox_inches=tight)
; `+ z2 F7 a% z8 X
plt.show()
/ O! h e- i: R
+ l# L8 g$ ]2 u1 M4 p Example 5:三维地形,包含投影(Python)
# C5 @0 [' }# ?
/ {9 \6 m, a8 }
Example 6:切片,多维数据同时展现(Python)
9 ^3 v& i5 R2 w2 x9 D' h+ n
. a# U' V7 R( U8 @. M% C* i Example 7:SSH GIF 动图展现(Matlab)
% l' o" c8 A$ `( y
6 b8 d2 M- C7 W& b2 ~3 i Example 8:Glider GIF 动图展现(Python)
9 Q+ t# e; Q2 ?$ }6 {8 p/ x
# D/ n5 H ^! K
Example 9:涡度追踪 GIF 动图展现
+ n, t% I- X$ L% X2 C& [
0 W$ Q }4 d: d" G- i% I4 T