0 T1 W0 ?) i& V0 `$ j! e. U
在我们科研、工作中,将数据完美展现出来尤为重要。
2 k$ @3 Z7 g! \( o% E" r 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
R* v$ J# [5 J1 ~# Q0 h7 w; Y: J
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
! ]5 Z o9 ?( s Example 1 :散点图、密度图(Python)
: q- o, G! O. ]6 P
import numpy as np
4 M% |& y% M+ \% P+ O% z import matplotlib.pyplot as plt
# V. H9 A" @+ p& Q z0 L* k* D; P
# 创建随机数
0 ~ H- t E1 k$ k7 T4 x/ V
n = 100000
' g' A7 C' h" u# t U% C1 G" Q/ I
x = np.random.randn(n)
- j" |6 @' L% z' M6 m y = (1.5 * x) + np.random.randn(n)
, {) h" S3 Z6 }1 q1 Q6 q- k6 j fig1 = plt.figure()
( t9 `, i" k# P9 L plt.plot(x,y,.r)
/ }% P2 a* n! h9 D0 a& t3 z
plt.xlabel(x)
8 P. Q/ b4 {4 _, a& b. z plt.ylabel(y)
+ f% T9 n, R: O4 ?3 x! ` plt.savefig(2D_1V1.png,dpi=600)
! G" X+ } x" S3 R% u& A1 I
nbins = 200
" w/ M! \. O% W2 i" ^& I6 w" ^1 y
H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
) d" r, F' g4 p" Z0 ~, ~$ a # H needs to be rotated and flipped
- d' H3 i, B* v- _' n2 R H = np.rot90(H)
) u1 [$ x. f. i, M$ s3 A H = np.flipud(H)
7 A6 ]2 c L8 Y) e$ `, I4 ? # 将zeros mask
; ^9 J8 S7 k5 G) {0 v9 g8 n( I" t
Hmasked = np.ma.masked_where(H==0,H)
, p# O; X4 l5 e f& t2 g
# Plot 2D histogram using pcolor
) t+ m Q, s: a5 a: i* y* ^# o
fig2 = plt.figure()
2 E6 X9 F$ z! B# L/ q" d plt.pcolormesh(xedges,yedges,Hmasked)
8 v% s4 E( {6 C: P% o plt.xlabel(x)
3 }# N- G; N0 A9 O$ }; _( J/ P! y plt.ylabel(y)
8 N' b& r+ q. _- E" w+ M. u$ y1 M. X2 R
cbar = plt.colorbar()
) ]" r3 W" f! `5 A ] cbar.ax.set_ylabel(Counts)
. t% @4 d. }4 o Y
plt.savefig(2D_2V1.png,dpi=600)
, T+ i; v" j: S plt.show()
2 W% q% ~! C3 z/ F
) F/ Y3 y( B$ j; d8 S % i, @9 ~ C( m6 Q8 W0 S& @
打开凤凰新闻,查看更多高清图片
- J8 E% B R" S
& K/ R. R" R# H 5 H. Q$ ]3 T" U7 {2 ~ A1 ]( {

) R6 T9 c* K$ [, y" u! _1 T* h4 C
Example 2 :双Y轴(Python)
+ y4 _( [5 X+ D4 j3 R import csv
* }5 K _7 \, b4 \2 Z+ X ~* H% H import pandas as pd
! O) d% }1 a% x" o2 [2 C( g$ ^
import matplotlib.pyplot as plt
' k- f( U+ K8 _5 x+ ]+ @
from datetime import datetime
, v; `, {" Z. k% z
data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
: w8 t- t* F0 L3 h- F
time=data[date [AST]]
' s6 p' S3 {' V5 O- b& z
sal=data[salinity]
j$ P9 v" K# e; |) l) l% w tem=data[temperature [C]]
% }% W' a: N$ [ a# H
print(sal)
2 J) I; T- z2 Y/ v2 `
DAT = []
- Z" `; l( P& h5 W" g for row in time:
7 ~* _6 N# d: `& @- D0 O$ f
DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
& k; D- p$ E8 q! m6 j' o/ h
#create figure
3 U8 H' s$ B6 }
fig, ax =plt.subplots(1)
+ o! G6 l9 E S
# Plot y1 vs x in blue on the left vertical axis.
. A; _& ~6 s2 o+ y2 y plt.xlabel("Date [AST]")
, P. u8 H2 m- S+ b plt.ylabel("Temperature [C]", color="b")
' J2 \9 O9 C m4 Y+ U) E6 O# w! B plt.tick_params(axis="y", labelcolor="b")
8 Z# y& o# C1 ~ plt.plot(DAT, tem, "b-", linewidth=1)
* `9 r* D' v" H+ |% `2 {0 h; U4 c plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
' w, _, k$ [# ^# } fig.autofmt_xdate(rotation=50)
3 Y" B2 w$ n2 j% U. e # Plot y2 vs x in red on the right vertical axis.
3 N9 Y! \* H H3 A# G; L
plt.twinx()
$ |- Q: ] y) ]! G0 o6 u plt.ylabel("Salinity", color="r")
% e* A, }( X s7 E+ A2 V plt.tick_params(axis="y", labelcolor="r")
3 G/ [+ c( \# F0 e( \4 E6 c! S plt.plot(DAT, sal, "r-", linewidth=1)
: @2 n( ?0 `2 j' A
#To save your graph
! e) r( J5 F6 e# w* ?, l5 |
plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
2 e+ G' `7 [" e! S' Z" r) G plt.show()
4 C1 h, y1 O4 v% P& W6 e( Q 
' S6 x& K- S4 V+ M1 w Example 3:拟合曲线(Python)
/ N4 O: i# i4 c9 G5 T2 }4 P
import csv
) `6 k5 ]# x% g- N! G2 @( s import numpy as np
* e8 d9 c) x9 r" B+ |4 u! w import pandas as pd
$ S/ d c' y5 s0 S# w
from datetime import datetime
S+ U2 r- }- B7 | import matplotlib.pyplot as plt
$ l, p3 a4 [* E' K/ ?5 f+ H3 E
import scipy.signal as signal
* P" e7 ?+ N* ?" k
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
: B# e% O9 c7 E: o [$ @" [/ Y time=data[date [AST]]
- n$ {' j4 e, Z; o* o
temp=data[temperature [C]]
$ _- G% @3 J4 _9 i datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
: i( E( O! H; |. J DATE,decday = [],[]
; k! U. s, _7 u1 f2 I! r: e for row in time:
v! u* N U9 P
daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
8 |% Y- p$ m) j0 `9 U DATE.append(daterow)
8 Q6 N) S# D! i( d5 w3 a3 P6 ^ decday.append((daterow-datestart).total_seconds()/(3600*24))
: G, l7 t. n3 u( p- |( X V
# First, design the Buterworth filter
# G( H! H6 T/ T: y2 F0 y8 |& t N = 2 # Filter order
' O5 z1 ^% S6 D! A+ `3 U Wn = 0.01 # Cutoff frequency
% i7 Y" x: X U7 H B, A = signal.butter(N, Wn, output=ba)
# c, k1 S9 I* x7 Y4 W* v* v
# Second, apply the filter
& R. F& k8 X" C& q v+ W% q J: r tempf = signal.filtfilt(B,A, temp)
) o9 A( q$ Y% G2 U( h3 N g Q! C
# Make plots
$ V. F; ~( u5 I# k6 t8 H3 W& ~ fig = plt.figure()
4 x% f5 S$ K4 H) d ax1 = fig.add_subplot(211)
. u- g' m' g+ N* ^' k plt.plot(decday,temp, b-)
. X2 R8 _' c" Z! M plt.plot(decday,tempf, r-,linewidth=2)
( j6 b( U/ w7 f2 l) @6 d2 ` plt.ylabel("Temperature (oC)")
8 ~" X# n$ j) v* W) M
plt.legend([Original,Filtered])
$ U% ~' z% [' l" p* q plt.title("Temperature from LOBO (Halifax, Canada)")
* l; y k4 r1 P, }, f2 r! V4 Z
ax1.axes.get_xaxis().set_visible(False)
$ a8 N2 w5 L; v! T! o. Y' q ax1 = fig.add_subplot(212)
' S) _) N" h- y4 [
plt.plot(decday,temp-tempf, b-)
5 W* e# _: G: O, L2 x
plt.ylabel("Temperature (oC)")
4 p1 j8 ]9 `' ~% V5 @
plt.xlabel("Date")
- }! K/ ]8 b& T5 P plt.legend([Residuals])
3 p% c1 {$ w# e8 x4 U3 q" v$ G
plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
( G4 H9 @( j1 c& K$ c
plt.show()
t3 P+ Q8 s3 Y G3 m7 K. c 
# F6 N: h ~( M _; w- V; x" E8 I Example 4:三维地形(Python)
* x/ m% _, U) Z# A) z. l3 }! k2 {# G
# This import registers the 3D projection
7 W- ]& r% Y9 w7 @0 o# b/ ^; N
from mpl_toolkits.mplot3d import Axes3D
; \' z) H; e* A% @1 { from matplotlib import cbook
4 J1 T/ [: `# n, R3 z" V& j. t* n from matplotlib import cm
: ~5 F+ t$ g$ T! U% L$ ` R from matplotlib.colors import LightSource
) ?3 y; C# d5 S2 O
import matplotlib.pyplot as plt
2 Z# Y% B# O; R4 g$ P+ X% R) R import numpy as np
' F! {, N7 g4 C- ]) E( ?/ s5 ~3 | filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
# G1 x, G3 l4 ` P3 [; q1 q with np.load(filename) as dem:
' c4 F4 ^6 V4 a1 k z = dem[elevation]
2 w/ {$ g+ o' N5 e% X+ `: F nrows, ncols = z.shape
7 Y& L9 d+ E# F x = np.linspace(dem[xmin], dem[xmax], ncols)
# P6 i$ W0 q1 ^6 b$ Y" {, P5 [5 K
y = np.linspace(dem[ymin], dem[ymax], nrows)
+ U" N9 W" f6 [# l
x, y = np.meshgrid(x, y)
9 N6 T1 d9 \8 i, @
region = np.s_[5:50, 5:50]
# ^( P* C& f( x" p' V L
x, y, z = x[region], y[region], z[region]
, _. ^- r2 t, o5 u; H/ J$ F
fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
2 v |7 h+ }4 ]7 X8 p
ls = LightSource(270, 45)
: G: ^: c- L/ a( u% h0 w
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
' O7 \& M7 O6 t: {# }
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
) t' z1 S$ a' X4 b- }, z linewidth=0, antialiased=False, shade=False)
% Q: b; z! m6 T2 m4 o
plt.savefig(example4.png,dpi=600, bbox_inches=tight)
6 n( j% v* J: Y2 w* Z( | plt.show()
: q& _7 M2 Q/ M2 E7 }
" K1 c; \7 w+ }+ I' E Example 5:三维地形,包含投影(Python)
+ |* q3 s. U$ y& v) w# |" O 0 o8 ~! x# p, u# ]) _) P" N+ P
Example 6:切片,多维数据同时展现(Python)
- o5 u6 l8 V8 {, z2 U
6 ^# H' B( b S1 d9 |2 J Example 7:SSH GIF 动图展现(Matlab)
. R7 A! s4 H" E6 G. z7 J ( i. \1 S9 m' p) q# j' u
Example 8:Glider GIF 动图展现(Python)
7 s9 o; `; G3 i
+ v; ~, O4 q& P, B9 G
Example 9:涡度追踪 GIF 动图展现
- H; N4 P, P0 g# Z" O7 l+ @3 L
: |0 W) U8 r6 W3 H. v