9 n% H: W# \6 a 在我们科研、工作中,将数据完美展现出来尤为重要。
0 B( b7 j8 n% k
数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。
* e' s9 t, z; k0 \/ T. g2 E2 i
下面介绍一些数据可视化的作品(包含部分代码),主要是地学领域,可迁移至其他学科。
i5 e( v" c( C Example 1 :散点图、密度图(Python)
: b: r& }/ {8 }! { t' A import numpy as np
. A) u6 h! J! V* ]& @8 O7 Y$ K3 h import matplotlib.pyplot as plt
. ]" k3 }( G" \* y* c. k( V1 K
# 创建随机数
8 p: [! Z3 C" T: r. y4 R
n = 100000
4 b& b" Z1 V l, ]5 ?, W% r% e x = np.random.randn(n)
+ @8 P9 {# k9 J y = (1.5 * x) + np.random.randn(n)
" r1 R3 t+ n" y% K/ M! Y
fig1 = plt.figure()
* R: y: [4 |2 W2 m' ]; u l* A
plt.plot(x,y,.r)
o& t$ @- c# m; z. f: X
plt.xlabel(x)
6 w) F, H+ V: y* L! ^* P' [6 h' p
plt.ylabel(y)
! T# u: J! J2 }% T plt.savefig(2D_1V1.png,dpi=600)
J2 U) y* b2 {) ^# e/ X nbins = 200
% r% {5 E( x' @ H, xedges, yedges = np.histogram2d(x,y,bins=nbins)
0 u4 [8 E, g; [ n, {; O+ A # H needs to be rotated and flipped
! H/ m- [5 U8 r' O3 t H = np.rot90(H)
' E" } F' a* H5 v) {! a* H1 u H = np.flipud(H)
' K7 O- n$ X9 B$ O
# 将zeros mask
6 R3 J- d H: f5 v" J Hmasked = np.ma.masked_where(H==0,H)
1 D: r9 K# D. ^9 C* \ # Plot 2D histogram using pcolor
' N* I% C: @% |5 |! H( O7 _
fig2 = plt.figure()
# V1 C" W; [; V1 v plt.pcolormesh(xedges,yedges,Hmasked)
& e7 p1 a- X; @9 n6 S plt.xlabel(x)
' }$ |! g2 L9 Y2 f; }3 B
plt.ylabel(y)
# t5 s( B1 k o7 G& |& k9 `
cbar = plt.colorbar()
8 T$ I) Y1 n( g7 P7 O1 b
cbar.ax.set_ylabel(Counts)
5 l7 u; n6 p" ]: y
plt.savefig(2D_2V1.png,dpi=600)
5 q0 v: o* P0 t
plt.show()
4 {( x* o, V" m- y
; V: \: v2 M3 D1 v" J! x, d6 v ) R/ {6 w: {* g% {7 \
打开凤凰新闻,查看更多高清图片
0 X) O8 G8 o. p# x: k
' a+ n' o2 Z( K8 X9 i& t u 3 w' _8 y% n5 e# g8 J
. R% L9 ` _% b7 V7 |" C Example 2 :双Y轴(Python)
9 v" {: k0 w! q2 i, q3 F# | a
import csv
% [( |, T. Q8 G! P: b4 M+ K! z import pandas as pd
, } H& j' q$ X8 }3 R8 ~. Z1 { import matplotlib.pyplot as plt
' e$ g1 l+ F: ^8 @4 l
from datetime import datetime
4 T* v a9 V8 t) L& T data=pd.read_csv(LOBO0010-2020112014010.tsv,sep=)
; k6 t$ c" E8 j+ D# ~5 A! {
time=data[date [AST]]
0 @4 e% z! c1 D9 H3 u" j ^
sal=data[salinity]
. u* @* \5 N2 G c2 R4 b
tem=data[temperature [C]]
$ ~, q( ]( O, [: F4 _
print(sal)
" x, L' E! ]' T, _* w DAT = []
! Y! s4 B) F! e( [9 U
for row in time:
2 U. F/ {! a1 Z6 s9 z
DAT.append(datetime.strptime(row,"%Y-%m-%d %H:%M:%S"))
. Q6 A P) V: O* ^' Z4 A #create figure
0 d- i R! O! m1 r! ? fig, ax =plt.subplots(1)
& D! Z3 M- x" z# N& C # Plot y1 vs x in blue on the left vertical axis.
+ O, z, J$ f: G3 G' B2 i+ w2 G plt.xlabel("Date [AST]")
3 r$ L5 S4 \ Z# C plt.ylabel("Temperature [C]", color="b")
- @/ o Y, N1 x" q5 ?! ?$ t plt.tick_params(axis="y", labelcolor="b")
5 v2 ~. K2 F5 f' l; N! s
plt.plot(DAT, tem, "b-", linewidth=1)
4 S# S" }2 n0 I" l) x plt.title("Temperature and Salinity from LOBO (Halifax, Canada)")
. x4 \$ I! Z* y2 m0 a/ R4 ?. M fig.autofmt_xdate(rotation=50)
& p# f2 y" g* O: z7 R% F
# Plot y2 vs x in red on the right vertical axis.
2 O- H" I x5 p/ `4 a! M plt.twinx()
/ j* C6 i. B$ j t8 p
plt.ylabel("Salinity", color="r")
0 v8 n, @; j0 J/ w plt.tick_params(axis="y", labelcolor="r")
8 |+ X/ {3 x7 s- Y3 ^0 W2 G) y plt.plot(DAT, sal, "r-", linewidth=1)
# ]4 l0 e- c3 J7 z, S# |5 K, b$ g #To save your graph
& w3 d# e! w9 p. j* _' L$ l; \
plt.savefig(saltandtemp_V1.png ,bbox_inches=tight)
+ i0 }0 v5 e. j( L plt.show()
/ a: ^8 `2 V( B% b, m 0 r4 d9 m+ M5 K. G
Example 3:拟合曲线(Python)
2 V' O$ u, o# R% v; x& ~
import csv
& y; |4 H3 Z3 L V( B _ _" v import numpy as np
) K: h# `/ `* \ import pandas as pd
# N I' c% l$ H% P8 n* U
from datetime import datetime
% Z( F2 Q+ p, A6 A* l9 O import matplotlib.pyplot as plt
0 k4 X0 ?! n4 W( `& Z% w import scipy.signal as signal
* E1 ^$ R2 Q. N+ Z" {0 u: R
data=pd.read_csv(LOBO0010-20201122130720.tsv,sep=)
* A' M6 i6 c0 K/ c5 d+ }) I time=data[date [AST]]
2 Z* {7 L) }9 |, j8 @ temp=data[temperature [C]]
, _' s( L6 m) y
datestart = datetime.strptime(time[1],"%Y-%m-%d %H:%M:%S")
! H8 R$ @2 S8 d' Q s! J4 X" O DATE,decday = [],[]
: a+ W8 J0 W4 f1 `5 W" M3 T1 Q for row in time:
( L/ B; U, y3 V0 Q$ \3 w6 s, e daterow = datetime.strptime(row,"%Y-%m-%d %H:%M:%S")
$ O3 C. d, d) c2 o' I DATE.append(daterow)
$ W8 Y$ |0 O/ _' ?/ g( L decday.append((daterow-datestart).total_seconds()/(3600*24))
' S: a5 T. ?2 Y' z% C7 z1 _ # First, design the Buterworth filter
# U3 s3 \ _% n, P
N = 2 # Filter order
5 I" N2 S! w- k& F% y- Z' c
Wn = 0.01 # Cutoff frequency
7 S# t% m, F$ j7 K! B' U% K
B, A = signal.butter(N, Wn, output=ba)
4 Z' W+ ]) b0 X% ~7 j8 x# y V # Second, apply the filter
+ U1 Q, C3 l) g* h7 V4 M5 A3 L% U
tempf = signal.filtfilt(B,A, temp)
! K9 Z# r. H; P
# Make plots
" i* ^3 d* y7 M( X5 T fig = plt.figure()
! }5 Y6 J! y4 ]/ F
ax1 = fig.add_subplot(211)
) G, v' j' F$ Q
plt.plot(decday,temp, b-)
- O4 f8 r3 q. c( l3 j# [
plt.plot(decday,tempf, r-,linewidth=2)
5 k( O' g4 t$ G; `8 A. ]1 m! k plt.ylabel("Temperature (oC)")
8 P8 D+ u/ F3 Z/ a* k) v9 W
plt.legend([Original,Filtered])
" S/ R1 _+ n* j) }: K$ _% [( o0 d8 K plt.title("Temperature from LOBO (Halifax, Canada)")
2 `; Y# l- n) {4 b6 z4 g* L2 V ax1.axes.get_xaxis().set_visible(False)
+ \, P0 X; m8 U, F
ax1 = fig.add_subplot(212)
; ?/ Q# Y4 \% o1 [2 x8 R$ L1 G
plt.plot(decday,temp-tempf, b-)
. z* p j# R; J
plt.ylabel("Temperature (oC)")
1 K! N& o1 s! K$ L! U. y plt.xlabel("Date")
$ ]; f( I8 A0 j- Y3 a
plt.legend([Residuals])
1 m- w/ \& s1 ]1 {
plt.savefig(tem_signal_filtering_plot.png, bbox_inches=tight)
$ I+ z5 L. X% W+ p' h) T/ k
plt.show()
- F X7 F# `/ u
/ ]; A! m, ~+ A3 h6 y- [& v
Example 4:三维地形(Python)
" l [ b4 x3 `4 L8 Z3 h* u% m # This import registers the 3D projection
* W# w7 Y+ E! I+ h D
from mpl_toolkits.mplot3d import Axes3D
' y( D& T& ?( L4 B; a9 H7 ~
from matplotlib import cbook
, m& \, x% ^9 C( `' b) l3 [. m2 Z! Z' [ from matplotlib import cm
2 D6 g, I7 S4 N: ]
from matplotlib.colors import LightSource
& m w$ P1 a+ c8 ^
import matplotlib.pyplot as plt
9 V8 }% Q6 _0 A; H0 F( p+ e/ I7 L
import numpy as np
0 x& o; ?" v2 A9 t6 C, Z# f" a filename = cbook.get_sample_data(jacksboro_fault_dem.npz, asfileobj=False)
1 L5 O+ f8 b$ V o& T
with np.load(filename) as dem:
3 x4 o+ h9 M: ]
z = dem[elevation]
/ N1 H6 Z; D5 l( S# V+ p
nrows, ncols = z.shape
+ T- r$ `- |. s, o7 U
x = np.linspace(dem[xmin], dem[xmax], ncols)
; Q; Y4 O4 O4 p/ |1 T# a3 y! c
y = np.linspace(dem[ymin], dem[ymax], nrows)
+ d+ n# P# O' Y6 _ V0 A
x, y = np.meshgrid(x, y)
' q2 L: v7 Z% p6 I6 H
region = np.s_[5:50, 5:50]
! i7 b' E, c L4 z$ g
x, y, z = x[region], y[region], z[region]
4 g- u3 {6 ?+ h R/ h0 A6 j' H
fig, ax = plt.subplots(subplot_kw=dict(projection=3d))
0 v, k: d/ c$ n4 L! h6 Y ls = LightSource(270, 45)
+ Z a6 ]8 o. B9 ?/ r rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode=soft)
0 i5 [0 w. P5 z4 t# m% V surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,
: k- ^6 Z, [7 }) ~) s4 ]# ^
linewidth=0, antialiased=False, shade=False)
3 u# S" F4 b. C$ b
plt.savefig(example4.png,dpi=600, bbox_inches=tight)
]! c9 r7 k. |+ L u3 A+ n
plt.show()
5 J2 G' D- k# j$ g L+ T
- I$ }- m6 h6 u, P! l& N# @3 k( `5 N Example 5:三维地形,包含投影(Python)
& N8 s3 P" v7 X8 c5 S7 V- k7 L
. M9 g4 B/ m% V8 ^
Example 6:切片,多维数据同时展现(Python)
7 @; w! U% ?8 J5 u 6 T0 f- ?& K( j3 u( Q, u
Example 7:SSH GIF 动图展现(Matlab)
# d2 A+ }6 T$ U0 S2 X 5 W8 p$ N- t: u5 C/ z& \2 [
Example 8:Glider GIF 动图展现(Python)
# v; B4 Z2 u) v9 ^! R' X" w. B
3 M3 W* Z6 P6 y2 v Example 9:涡度追踪 GIF 动图展现
) t# Y/ J2 T' [- U1 S7 @
: ~# l% s) P$ E# G" b3 g7 z