5 O% k$ ~& D0 s1 t( Y4 Q8 R$ h7 [0 b 在我们科研、工作中,将数据完美展现出来尤为重要。
! T- F+ K9 J1 _+ I) M% `. t: C4 p" S
数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
! l. ~$ n0 X; R; z
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
. ~; w: k9 x Y6 [ Example 1 :散点图、密度图(Python)
& e8 F. f' |0 r( Y) w5 ]0 t2 i1 @& Q
import numpy as np
, O; j! t5 W6 u9 _
import matplotlib.pyplot as plt
3 N6 _! E6 T+ p3 a `+ r- K
# 创建随机数
{( z/ \ s3 G
n = 100000
. F8 j4 J) f' S% ?1 u& t( L& u, D2 K
x = np.random.randn(n)
; x& `$ l# d6 M% w
y = (1.5 * x) + np.random.randn(n)
/ g' l- E0 B. T9 L
fig1 = plt.figure()
& w" @1 }1 N# T( T$ C plt.plot(x,y,.r)
$ l4 @% a+ n1 ?3 N( B plt.xlabel(x)
1 A4 V. C2 @7 v- H. c% _4 I$ ` plt.ylabel(y)
5 e0 z d+ k s5 _0 t
plt.savefig(2D_1V1.png,dpi=600)
g5 n- Q7 a: X' {# d/ B1 A9 t3 D
nbins = 200
# p, c) k3 E5 v" X4 x
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
8 s0 m& b& X. g0 n" k, T/ X y
# H needs to be rotated and flipped
7 ^- l2 f; u5 V# Z H = np.rot90(H)
& d5 I& c# _4 } H = np.flipud(H)
7 X* s" H) U: s3 b # 将zeros mask
~& f: X* K, x, ]
Hmasked = np.ma.masked_where(H==0,H)
$ k' Z% O$ e5 e9 l X1 U0 }
# Plot 2D histogram using pcolor
+ v* A. o2 E" i( r& X- ~! [
fig2 = plt.figure()
% P+ F0 @& q+ {8 F plt.pcolormesh(xedges,yedges,Hmasked)
4 c2 s3 v* ?% `: I* @5 U plt.xlabel(x)
2 b; h; z9 l, [) H plt.ylabel(y)
9 l7 `. y6 m- X+ B cbar = plt.colorbar()
* E+ w: e/ t. C6 Q* E- R0 ?) P cbar.ax.set_ylabel(Counts)
* [% @, U1 Z, K/ R- E1 t9 |; x plt.savefig(2D_2V1.png,dpi=600)
6 Z$ J# e! m1 k% T
plt.show()
) z) {3 O. n2 }8 U$ ^# G
1 g$ l5 x/ K8 z v# ]6 D, |
P- D; n$ H8 `+ d2 y. s. V/ [% X
打开凤凰新闻,查看更多高清图片
2 |& L, f0 a$ O; w, Z& D ' X1 @6 M1 @9 f" e
& T! u8 m' k# a3 |) X7 Q

- S+ k5 m6 o) u* w. Q Example 2 :双Y轴(Python)
& H9 @3 S4 `* U2 E
import csv
1 G: ~0 T1 v( i
import pandas as pd
$ ^( r! [5 q! q1 S import matplotlib.pyplot as plt
4 t: I8 Z' e( H+ o from datetime import datetime
: ?+ t, s& u2 i4 h% {' a5 ?1 S
data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
/ y- B3 U6 T( o' Y3 s/ g& W time=data[date [AST]]
1 W% ]6 Y6 N5 J1 y/ @& d
sal=data[salinity]
7 n4 H3 C" l& V( z; B
tem=data[temperature [C]]
' b8 M `- G6 L
print(sal)
7 L4 B, L. r6 v3 Z' c A
DAT = []
& D3 d% }! e( v2 P4 @1 \/ q for row in time:
6 }8 X. a1 Q' r( ^0 [1 S! p% F
DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
: [$ ~+ k* Q' ` x; A: @9 m #create figure
) k# l6 E8 }0 d fig, ax =plt.subplots(1)
5 f' p9 B& \, U5 K; [1 r6 l; N
# Plot y1 vs x in blue on the left vertical axis.
( x5 A. t) x8 R: a: \# x+ d plt.xlabel("Date [AST]")
- V' m4 r( y* u2 z4 a
plt.ylabel("Temperature [C]", color="b")
6 s: @" I- C$ _5 {1 n4 ]
plt.tick_params(axis="y", labelcolor="b")
! t" E5 H0 A0 S6 N
plt.plot(DAT, tem, "b-", linewidth=1)
0 A. H5 v3 h) B8 X* g. N
plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
D; |. H1 d# y/ t+ Q fig.autofmt_xdate(rotation=50)
- F( ]" B; A# J. C! I5 H9 h # Plot y2 vs x in red on the right vertical axis.
3 H6 w6 V- y8 L* m, U5 f* ]" A& \" N
plt.twinx()
+ I: P# ]- e2 J* w
plt.ylabel("Salinity", color="r")
1 H- f- p2 i& L/ g& V8 d ~ plt.tick_params(axis="y", labelcolor="r")
# O6 f' r8 P7 z& }: d0 e8 p
plt.plot(DAT, sal, "r-", linewidth=1)
c: M& S/ i; w$ Y7 z/ Y
#To save your graph
1 R$ h# M+ d* E* b0 H
plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
, c) q. _$ J( c8 T, R" e& w6 N plt.show()
+ ~2 p. m5 T7 v. }

, C* `5 u- o. \6 C8 d3 h7 h Example 3:拟合曲线(Python)
3 Y2 k# e) C& a9 f/ ?7 ` import csv
% d& }. y+ U$ m4 ]0 @
import numpy as np
* w6 {7 }2 r# h6 f X) J, @ import pandas as pd
! L5 c1 z, T' }* L* X+ B/ ]
from datetime import datetime
. `. v Z3 j/ h" ^4 V
import matplotlib.pyplot as plt
2 _8 H6 Z( T, w' B- n import scipy.signal as signal
- O1 o3 O* B1 j( s, K3 M% O" H
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
( L4 w1 {' v& n) b. s; Y; N/ X
time=data[date [AST]]
7 U l% ?$ o1 h z) e q
temp=data[temperature [C]]
$ S% w& P# N, m" o datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
8 n8 z) E; F& b" \ DATE,decday = [],[]
' ~1 |- V: X5 c4 `% X for row in time:
! S4 U3 y0 i, ]# _3 Y& {
daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
6 I' A- y7 ]: x, b7 U; s) P) g
DATE.append(daterow)
4 q2 d" T% g. [1 L) ]
decday.append((daterow-datestart).total_seconds()/(3600*24))
2 I- }/ `- ?/ s$ E# ~( P: |. r0 e7 Y
# First, design the Buterworth filter
# D6 R( @- D/ F
N = 2 # Filter order
: o: ~" W2 H# D* a& Z
Wn = 0.01 # Cutoff frequency
& `2 v# B- g1 L# d& ~
B, A = signal.butter(N, Wn, output=ba)
; W' Z% _5 ?9 w7 g8 q9 E # Second, apply the filter
: x8 A$ C* y" a
tempf = signal.filtfilt(B,A, temp)
5 j; [+ _* z" L' a# a: x
# Make plots
, h- i k+ d4 w O. O9 W$ S$ R0 E! H( O# p
fig = plt.figure()
. B$ `8 @9 |6 @9 j- X1 I* o ax1 = fig.add_subplot(211)
& P6 Q; q( B+ e+ K/ J, Z- E plt.plot(decday,temp, b-)
: J4 }) w, ~% {6 S/ ^' N
plt.plot(decday,tempf, r-,linewidth=2)
8 m5 M$ a; \$ Q; ~8 ~2 c plt.ylabel("Temperature (oC)")
, e' {; }' L5 J
plt.legend([Original,Filtered])
, T: |1 n6 d$ O5 I& Q' s: ` plt.title("Temperature from LOBO (Halifax, Canada)")
. ^- @2 Z. D- ?( D
ax1.axes.get_xaxis().set_visible(False)
; K9 ]1 b* I$ r1 o ax1 = fig.add_subplot(212)
7 a$ w- U, Q. r% r4 X9 u/ o, n& y, _$ a
plt.plot(decday,temp-tempf, b-)
8 {; l7 H6 ^3 H" }/ P
plt.ylabel("Temperature (oC)")
9 i; t4 @: p+ O plt.xlabel("Date")
* P2 |- l0 Q1 X; a" r# ]2 G
plt.legend([Residuals])
7 d* C F9 K+ o plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
+ t" Z1 K. m7 o" C
plt.show()
/ D' [ ^3 B4 m* v 
+ T6 s3 ~! [; J8 S- c5 Z% p2 t- W
Example 4:三维地形(Python)
1 \$ V @1 |/ A. I7 @0 J: h
# This import registers the 3D projection
9 Y) K; X7 c& X; S# W from mpl_toolkits.mplot3d import Axes3D
7 W3 j' X8 p# _! R4 P% y8 |
from matplotlib import cbook
& C' v$ d8 y }; F, m+ Q% J from matplotlib import cm
W: F& W+ ]% g$ l
from matplotlib.colors import LightSource
8 n I( I3 I/ N8 A
import matplotlib.pyplot as plt
$ W" G3 N7 g8 k' J& C
import numpy as np
2 i! p: F! F& d& D. M3 Z
filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
& |8 F" r) n: y3 I1 N! v/ i' V
with np.load(filename) as dem:
. R' C# S% C7 L9 u& `+ Q9 W0 L z = dem[elevation]
8 s/ `! K2 y. u# M0 }
nrows, ncols = z.shape
8 a t2 q& T6 `: { b x = np.linspace(dem[xmin], dem[xmax], ncols)
9 W" x& Y" c+ S+ _
y = np.linspace(dem[ymin], dem[ymax], nrows)
9 l0 N. y4 W& Y: N+ E, q
x, y = np.meshgrid(x, y)
: J! ?; O9 T/ q+ X* ~
region = np.s_[5:50, 5:50]
2 O- I+ s5 K* K: f
x, y, z = x[region], y[region], z[region]
6 z% o9 Q. S' I. V# f8 m/ z fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
% K. p- l: o! Z
ls = LightSource(270, 45)
6 c' E/ H s8 ^7 P* ]" ~ rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
( x& M- u# ?2 ~* U! z+ a surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
) v- T/ M! m0 F3 q
linewidth=0, antialiased=False, shade=False)
- E" D9 d5 \3 f# B4 S' K, q plt.savefig(example4.png,dpi=600, bbox_inches=tight)
9 S& u4 k: N8 ^9 G plt.show()
% x) r/ H0 u& N: T* [
( f+ `3 r, x, G) n, \7 }
Example 5:三维地形,包含投影(Python)
. Y e. }7 A4 N z 9 B/ R, B. [ z/ }: x! ]
Example 6:切片,多维数据同时展现(Python)
' @. o) O n9 l/ Z: `) m
4 d! S- w1 h# B1 z7 q7 x Example 7:SSH GIF 动图展现(Matlab)
; \* l4 v- V( d D3 H4 C! K x8 \! A) K
Example 8:Glider GIF 动图展现(Python)
2 ? Y5 V/ J9 H
* m& o, h9 {, Q Example 9:涡度追踪 GIF 动图展现
0 s& a8 w- z1 N( ^: h; d" C
8 ?( t# p3 I x/ F# P