7 O3 R- ]0 ?5 e2 N% G3 \( D6 I 在我们科研、工作中,将数据完美展现出来尤为重要。
6 X. x2 N" |" O7 J: j3 x! I7 x2 R 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
. l `- y \6 A7 [+ ?5 m' m
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
( J+ x" Z( i R' b$ g4 N Example 1 :散点图、密度图(Python)
* t0 t+ b: g' ^# W0 d3 |# Z5 m( L& H import numpy as np
% c F- S: W# i- H8 {/ k
import matplotlib.pyplot as plt
1 B. g3 t" W5 Z0 Z" L
# 创建随机数
, L9 h$ o* p4 Y* l; }/ N: `
n = 100000
' X$ P3 X3 a2 [0 ]4 |3 L8 s x = np.random.randn(n)
W( V2 K, c2 M6 q- e% t y = (1.5 * x) + np.random.randn(n)
. o z% L7 p5 Z1 y- Y5 l' |
fig1 = plt.figure()
4 k: o8 N7 g0 t: N3 A2 l9 J/ L$ Z plt.plot(x,y,.r)
& [- ]' W7 S' K8 d- t4 [
plt.xlabel(x)
4 D9 S5 k$ i% z% V plt.ylabel(y)
! L4 j8 Y6 b" J" A; a6 D' d' b
plt.savefig(2D_1V1.png,dpi=600)
4 W$ k9 _2 K6 C: J! C, i( v$ L# ?9 Q
nbins = 200
8 U: I8 `) V- r/ ?. T
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
3 k* N; ^( p7 g7 a # H needs to be rotated and flipped
6 x1 W1 z. a# G H = np.rot90(H)
2 d2 M# l7 |9 n
H = np.flipud(H)
. N. \1 Q3 `+ @+ U& [ p$ A/ t! f # 将zeros mask
6 p1 T; ~3 f$ a7 s- b Hmasked = np.ma.masked_where(H==0,H)
: T+ I. x, E8 }9 Y- Z # Plot 2D histogram using pcolor
; Y9 J% k% e7 s& H) I5 @ fig2 = plt.figure()
3 E8 B, q) P- @8 n. K
plt.pcolormesh(xedges,yedges,Hmasked)
6 O1 `3 y* K" l; s3 \4 c plt.xlabel(x)
9 Q1 x/ H4 i% ]0 M/ x7 ^; |3 I plt.ylabel(y)
4 ?' i D: p, t+ A: Q+ g: E" g) a
cbar = plt.colorbar()
2 a; j9 \5 u9 |! \4 @' [; y1 t cbar.ax.set_ylabel(Counts)
: n$ k5 g6 S4 Z" v9 d" t3 C+ ? plt.savefig(2D_2V1.png,dpi=600)
# d# k1 @! }" Y' ^% D) y# M
plt.show()
/ S4 ]+ ^$ A& u; v
3 }' ]6 Y2 n" ?# C7 e; D
! [; s1 @$ T$ Q& ^: z$ W7 [ 打开凤凰新闻,查看更多高清图片
9 J, @! |$ L* v) | ! ?$ x" K7 _: U8 p5 n
. I" h5 @+ J% L: B

0 F: l: R" y8 f2 j) \
Example 2 :双Y轴(Python)
* @8 G" r4 [: f* r9 F
import csv
" v) S8 {- `6 r, O
import pandas as pd
1 F: c" T; A" {
import matplotlib.pyplot as plt
3 f4 e! C F4 M F
from datetime import datetime
" V0 V: U1 c& q# { k6 @! e
data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
8 R' ^' e. y* J7 x4 p+ y$ n time=data[date [AST]]
, n! @% }8 [) B9 i3 p sal=data[salinity]
8 d- B L0 K$ F9 C; U& x4 G! N tem=data[temperature [C]]
/ S6 v/ Y/ ?( y
print(sal)
+ v& W) r; o& W2 _
DAT = []
( y/ R7 p4 ^& x+ [2 ]0 | for row in time:
( E$ x* ]* Y8 u/ V$ e
DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
4 G) M7 a! @- ]( D0 w #create figure
" `' P" @1 Y; ], D) d U fig, ax =plt.subplots(1)
& C8 S1 r( I+ k' b% J
# Plot y1 vs x in blue on the left vertical axis.
; j- s0 a A6 L5 @3 O
plt.xlabel("Date [AST]")
& C6 v, F) b' |$ t
plt.ylabel("Temperature [C]", color="b")
/ X2 O8 e3 \, X8 p; B! [. ~5 d plt.tick_params(axis="y", labelcolor="b")
$ q0 ^. B) K# R/ t, ] plt.plot(DAT, tem, "b-", linewidth=1)
3 }1 x3 @6 {8 v2 ^ plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
) T1 `3 k! F' } fig.autofmt_xdate(rotation=50)
: d6 i7 G4 U* a' Q2 U
# Plot y2 vs x in red on the right vertical axis.
0 }, W) Q* {* q- a( k6 Z `$ |% H
plt.twinx()
% [# Z4 V& J# |+ E plt.ylabel("Salinity", color="r")
( W( J7 y; u5 C! I% I
plt.tick_params(axis="y", labelcolor="r")
( i2 I* D! `" N$ n$ K1 H. X
plt.plot(DAT, sal, "r-", linewidth=1)
7 C$ g9 Q2 J& h( I u
#To save your graph
, d5 p. `" Z9 n! V z- a- H( s
plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
& {" b; P8 X9 y4 I9 R0 C }; j
plt.show()
6 w. m9 ^# _4 ^$ B4 W5 M) {3 v0 t 
# k) m' Z+ `3 e- Q% Q- N; t Example 3:拟合曲线(Python)
* `' |+ v5 l# d7 j3 T8 o import csv
3 g# l6 n1 b& u5 y2 l0 A import numpy as np
6 g% e$ P2 D. c0 t6 R0 ?1 t
import pandas as pd
8 i# Q: c8 J) Y: a& o' h: k from datetime import datetime
2 R4 z1 `. {9 o% H# v import matplotlib.pyplot as plt
2 V. h# n6 e1 `* O: ~
import scipy.signal as signal
9 j, m7 ]0 S6 {" `# W data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
: D% F1 O' r5 [, W time=data[date [AST]]
D# W2 m3 _; ~: K4 h4 L
temp=data[temperature [C]]
! ]2 x! {% Z7 T! O datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
4 K+ w M- o) y/ [ P- a DATE,decday = [],[]
. A1 _6 I \; X for row in time:
6 t+ f6 W, L; O2 E4 N' d0 h( }
daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
' I4 x A J5 {% P
DATE.append(daterow)
2 H5 n/ M1 B+ A5 i7 j* Y
decday.append((daterow-datestart).total_seconds()/(3600*24))
7 _9 L+ _2 _2 c7 `7 \& u9 m5 b3 K4 C
# First, design the Buterworth filter
^& M8 j7 D. z0 ~ N = 2 # Filter order
( J; u9 W6 Y; z6 A+ ? Wn = 0.01 # Cutoff frequency
7 l; Z L8 ^- T2 C- K
B, A = signal.butter(N, Wn, output=ba)
! U' L* `' h8 Z1 j7 B # Second, apply the filter
6 d% K8 v3 S9 H tempf = signal.filtfilt(B,A, temp)
7 v, F0 b- i$ W5 m # Make plots
# Y/ t, g$ m4 D3 L' H
fig = plt.figure()
: U' k) R+ V3 ?- K ax1 = fig.add_subplot(211)
& Z* m6 R8 J$ |! H
plt.plot(decday,temp, b-)
# p5 ]2 v, g7 F' j/ D plt.plot(decday,tempf, r-,linewidth=2)
B8 p: Q1 b* F/ a& g$ w! w
plt.ylabel("Temperature (oC)")
7 p2 H% _5 d- Q4 z plt.legend([Original,Filtered])
. {) W! q; l0 @3 i$ \- r7 j% }
plt.title("Temperature from LOBO (Halifax, Canada)")
& T6 r k+ d$ V! j2 W" G ax1.axes.get_xaxis().set_visible(False)
+ p4 r) |5 e" ~1 r
ax1 = fig.add_subplot(212)
$ O0 t! s0 c: v( d- A plt.plot(decday,temp-tempf, b-)
' h. F) q5 Y, g% X# Q: C: h- v
plt.ylabel("Temperature (oC)")
) Y! Q5 Z9 f3 g0 T
plt.xlabel("Date")
% W0 L0 l: L6 ^ plt.legend([Residuals])
& l. G6 E. _- V4 ^ plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
5 [2 V2 d9 Q# N3 ^; S4 W0 q- A; \
plt.show()
3 k$ i; c6 e Q. j' z 
% Q" a. f* a" ]7 l
Example 4:三维地形(Python)
$ s; ~- ~* Z" F6 ~5 ?2 M, g% ~+ F
# This import registers the 3D projection
; K* ~& L: e2 m/ F from mpl_toolkits.mplot3d import Axes3D
; m, ~. n3 c% i: X% H$ Y from matplotlib import cbook
$ a, O4 [2 E, W! F) ^
from matplotlib import cm
6 s; X: j: v( n: z
from matplotlib.colors import LightSource
# {, X8 G! J: [9 h/ ? import matplotlib.pyplot as plt
5 C- K0 Y8 N8 S+ A, X
import numpy as np
6 ?% m: c0 F% U! ]& F8 t4 {4 N
filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
# m/ M3 M5 x* B- R$ i% ? with np.load(filename) as dem:
4 _4 i& r1 H' m; v7 O# n
z = dem[elevation]
N& i& |$ c' q' u; v nrows, ncols = z.shape
. K9 \+ ~7 j8 J. R' S8 D x = np.linspace(dem[xmin], dem[xmax], ncols)
C' w2 |- X* Z- ^( L y = np.linspace(dem[ymin], dem[ymax], nrows)
* ~2 I! @2 k6 m( D. l x, y = np.meshgrid(x, y)
0 q4 k4 k; {# F7 f region = np.s_[5:50, 5:50]
4 L! H9 N" L7 x5 A' v' N# f, I x, y, z = x[region], y[region], z[region]
* c, t. K' W: v& M fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
; u5 g2 W% t! W" l6 ?! ?5 D4 ?+ H ls = LightSource(270, 45)
' S ]; p6 t: B, S. h, v3 R9 V
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
: s5 }' f2 p0 o surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
- P9 ?7 F* ], Q
linewidth=0, antialiased=False, shade=False)
: o4 c0 z7 P5 ?" ~& F plt.savefig(example4.png,dpi=600, bbox_inches=tight)
I0 Z7 I2 n! o9 J
plt.show()
) ]9 v0 A1 L+ Q( l* U$ h' j) ]- V
0 k! w/ v; C) k" ~0 i. p$ j Example 5:三维地形,包含投影(Python)
6 r. \7 o B+ T* n& I
& P0 i# v% r" Q; i0 p Example 6:切片,多维数据同时展现(Python)
* p1 ^+ t+ a% Q* K5 _; e- `2 ^0 L " R7 ~- j4 ]/ }+ r7 y
Example 7:SSH GIF 动图展现(Matlab)
1 Z: c1 P- W9 i# t9 ]
1 F2 L5 r5 p) N. P: F9 Q% O" P Example 8:Glider GIF 动图展现(Python)
- G! c/ ~" G8 r- ? k$ ^
7 G4 I) s$ t m* n, L Example 9:涡度追踪 GIF 动图展现
2 ~' p8 i% d: W" P 7 h2 {4 P4 @& Y