数学建模社区-数学中国
标题:
一行Python代码有多强,可让图形秒变「手绘风」
[打印本页]
作者:
杨利霞
时间:
2021-7-22 11:56
标题:
一行Python代码有多强,可让图形秒变「手绘风」
7 i6 f/ r! i5 J! U( E5 h7 ~0 c
一行Python代码有多强,可让图形秒变「手绘风」
$ |# |) I' H' K
之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
, Z% L+ k$ e3 q- H# j) s: x# r
9 r8 V& R* o V8 U3 z: ?& ]
; ~! @2 s' \- K0 @& L# `
但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
8 _, |* G5 p" N% \
0 Z* D8 ~7 m' v5 V s& f) ~; s, [
. f6 |3 }( k5 M4 h2 C: C
matplotlib.pyplot.xkcd()简介
& A4 H* Z# b, Y0 J- x
这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
7 t; h$ a1 X8 E
$ F+ l7 }4 h" A }
, c# P& _6 o9 C
matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
) X1 y( l1 f% Z# c& M* }
length=100, #褶皱长度
0 r h5 p/ o3 X! B
randomness=2#褶皱的随机性
7 j6 P9 w7 r o+ F+ J- C( y) c2 S6 \
)
# E$ x) C# }% F
matplotlib.pyplot.xkcd()使用
5 R, i+ @/ B* U) E0 d" P
如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
( H {/ j& V) |2 C
# d8 A9 d6 `/ u# T. y
: Q4 f: }2 A3 j- J
with plt.xkcd(scale=1, length=100, randomness=2):
8 J2 T+ F& t- A8 @* \/ b7 e% A+ `
#with是临时使用一下,不影响其它图使用正常样式
1 j* x9 S. _0 C% d, S( w
绘图代码
4 T8 v# [$ d" R: h
。。。。。。
, _' }5 u9 j1 D2 U2 ^2 X& k. u
plt.show()
& C r' v1 W# k8 g1 V' o6 g: G6 y
matplotlib.pyplot.xkcd()使用实例
$ n. p5 ^2 \4 u, H4 K2 X I
下面代码为pythonic生物人公众号之前的文章代码
$ V$ d$ e& D m
' d M( c6 s9 \. u5 J9 w
& G8 Z7 ^. T6 D) H* S" H5 [
以下参考:Python可视化25|seaborn绘制矩阵图
: l) i$ D9 A1 O# \! [
% x% N) i, S+ K$ {$ k$ v4 f
6 L; c7 u7 l: h/ y) L
#支持seaborn
- ^8 \( t. O+ K1 G j
import seaborn as sns
) l* v' u6 B% F( \- N; f( T
iris_sns = sns.load_dataset("iris")
. h- n6 @) \; m9 e% T
with plt.xkcd():
3 Y' q/ |2 U) o9 l. b; j
g = sns.pairplot(
4 T- M. e2 U* h" N# r7 l
iris_sns,
0 F$ {# F4 H5 `; T, H& z9 d
hue='species', #按照三种花分类
- d' O1 l5 @2 Y# J( v: z
palette=['#dc2624', '#2b4750', '#45a0a2'])
6 p5 ]( n# @7 i3 S1 e
sns.set(style='whitegrid')
! s# m7 m; I( f; R# v
g.fig.set_size_inches(12, 12)
+ D4 d# ]7 s! T: j
sns.set(style='whitegrid', font_scale=1.5)
; e' q2 S+ w6 C' C
* c$ v% \ P) s& M0 e
( ?! |8 x) s/ z$ @1 |2 i( Q8 k
- ?/ N l( ]/ X: Z) a
以下参考:Python可视化29|matplotlib-饼图(pie)
3 H) g1 ^. Q' ^- v" g3 C8 E5 \
; M8 D: f+ F/ s
& P' |" x8 Y8 i; r: s& }
import matplotlib.pyplot as plt
. f; O% R o4 a: Z5 Q& h l$ z6 ~4 o
with plt.xkcd(
t. ]; o0 \7 n. Z
scale=4, #相对于不使用xkcd的风格图,褶皱的幅度
! M6 X' A! I' Q, b/ D" a' b, d
length=120, #褶皱长度
4 e2 A' Q$ y' s8 o; |; e8 k
randomness=2): #褶皱的随机性
" R/ n7 `8 J+ j B8 O# |9 z5 `
plt.figure(dpi=150)
( G0 A3 p, b) Q2 ]& |$ r
patches, texts, autotexts = plt.pie(
2 X: V5 `& ]8 G% x0 l* V2 A; w/ W
x=[1, 2, 3], #返回三个对象
% n( @' z1 U9 z, ~
labels=['A', 'B', 'C'],
( a! o! Z w# p
colors=['#dc2624', '#2b4750', '#45a0a2'],
! u1 l: L8 N$ Q% `# l/ ?
autopct='%.2f%%',
2 i0 w4 k6 m+ W8 F4 Y9 C, M
explode=(0.1, 0, 0))
- k+ c' J8 d$ P( I# o' }
texts[1].set_size('20') #修改B的大小
* B% z/ ]+ e. `; i
1 Q. i `0 ?4 r$ \; b& G! R
#matplotlib.patches.Wedge
6 `8 ]* b9 k% n+ c8 y1 t
patches[0].set_alpha(0.3) #A组分设置透明度
6 K8 M" e. q' t: N% z4 c( u" [
patches[2].set_hatch('|') #C组分添加网格线
0 W) u$ S, _- } ^. X9 D# Z' B
patches[1].set_hatch('x')
* s7 e3 B) o* X! |5 G
8 B& |$ m6 z; ]
plt.legend(
7 R3 e* ^/ p( y, w7 b
patches,
$ k1 i7 a. t# l. N' ^
['A', 'B', 'C'], #添加图例
! o- ^6 x. j3 E8 L* u2 T
title="Pie Learning",
$ Z/ r3 C* ]4 ~$ W$ V' u% n9 L
loc="center left",
2 ]# I7 B+ l; Q: ~
fontsize=15,
. i% c$ y7 K% C* O# I- {9 T% |
bbox_to_anchor=(1, 0, 0.5, 1))
# W. h5 ?& Q' q" F( k0 a" U$ Q% G& e
* M" e6 c, k- B! ?. c
plt.title('Lovely pie', size=20)
1 i7 b, b7 \! T9 M& r
plt.show()
) @7 |# X) ]3 `& h! ]
7 }. ]/ Y- K+ [& ?
4 q& X2 h/ }( l) P$ D9 X
8 q3 e K/ }+ c5 n. g B3 d8 B
) C, N5 s" v5 B _9 `4 ~
with plt.xkcd():
) ~3 x3 i- |( g$ @# ]1 t5 `" W
from string import ascii_letters
0 w2 ^/ q! u4 p: G
plt.figure(dpi=150)
\. E. r9 [+ v7 q/ E+ O
patches, texts, autotexts = plt.pie(
3 Y8 f, g: D$ h3 j2 u
x=range(1, 12),
* O: G8 Q- V/ j2 o
labels=list(ascii_letters[26:])[0:11],
9 L- Y4 W# u6 N& f4 X, S d! ~7 g9 V
colors=[
- D: t1 {3 I; B* @8 p9 v
'#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
( n5 ~5 b" V4 ?8 \; D3 c
'#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
9 y _) i% {# V
],
8 i, R# X9 ~9 i' p
autopct='%.2f%%',
4 F) D5 I7 H7 j7 t& u4 m$ ^
)
# ~5 U& o5 X( V7 X6 w& t
plt.legend(
- u# w Q& G* ?( x! g4 {
patches,
$ w9 @/ @! I/ @# K4 d
list(ascii_letters[26:])[0:11], #添加图例
Z/ o/ ?: L" c0 s6 p
title="Pie Learning",
* R' U9 W; [6 {$ e0 n W4 M
loc="center left",
/ i3 d! _% c( C W2 D! K1 z* ^
bbox_to_anchor=(1, 0, 0.5, 1),
% C* Q* @1 S" l) e& Z
ncol=2, #控制图例中按照两列显示,默认为一列显示,
; K' b0 y0 F$ i$ p4 O) p2 p
)
2 b! Y7 b4 O& `' K3 g! A- m5 `4 J
& N% j6 K* J& r" J( E+ X* {4 V1 g# h
! r% h/ r. g) N7 z) k1 c* J
4 ?3 [$ r) l" j- z" y
) D7 ^5 R4 F! r8 e7 @
import matplotlib.pyplot as plt
) C6 o7 ]8 k0 I; E8 e* R. }' t7 v
import numpy as np
: t# s& F3 }' [# c
with plt.xkcd():
0 ]+ i. G: R) ~/ o/ I% e
plt.figure(dpi=150)
* Q" r! ~2 |' r, i2 U
labels = ['Jack', 'Rose', 'Jimmy']
6 E8 a% z' u( X" T2 D2 V" Y
year_2019 = np.arange(1, 4)
\1 r) i2 L1 Q! K2 E( @
year_2020 = np.arange(1, 4) + 1
! ~/ p/ R; D8 a3 X4 L' l1 w% Z8 a
bar_width = 0.4
* u; l2 g3 x- A( Q' I/ y( ^6 o
5 [1 l; R% L, G( N
plt.bar(
1 F" |) C' S9 R3 |0 I/ p
np.arange(len(labels)) - bar_width / 2, #为了两个柱子一样宽
/ ]; A8 q+ Y( E; I3 j5 m+ Q; |
year_2019,
8 O( k" H4 J& ?( ^
color='#dc2624',
5 J; B h+ |8 }* [
width=bar_width,
* @3 U$ T0 ]% A9 k3 v
label='year_2019' #图例
R& T7 F/ M8 M# r6 H$ x* t9 T
)
. m8 P* P/ v# v$ o' q
plt.bar(
\9 n! k# K1 H$ _- T6 ~6 c9 Y6 \
np.arange(len(labels)) + bar_width / 2,
" O% n- G9 L7 a
year_2020,
/ V& @. W* g# l6 E# D: Y0 H! I
color='#45a0a2',
% R; b0 i U7 b7 q; {/ K/ F$ U1 p
width=bar_width,
# O1 |4 f0 c# w6 F# A1 a
label='year_2020' #图例
R; @2 \2 A4 H ?- g# X
)
/ l% a. Y, l! H
plt.xticks(np.arange(0, 3, step=1), labels, rotation=45) #定义柱子名称
: l% r& [7 r) y) N
plt.legend(loc=2) #图例在左边
! I" I+ F& e1 k& _
以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
8 r) @9 v+ `+ J- R5 B
0 x) v9 F7 M: B! @- j' L
9 K3 O7 i" M) P' ^( [
) ?! }$ y% }5 {) Y% p
8 `: p- ~! v8 T; m6 a
~' Z, k# o. t) t% H8 E; i5 ~
' f# ?! `! s; b8 ~( T
以下参考: Python可视化|matplotlib10-绘制散点图scatter
# `. E6 y4 _* H1 f. g
# S. z/ Y8 Z; W+ m$ ~" R: K' T8 W, E
5 @4 l* Q4 s' c
import matplotlib.pyplot as plt
' L6 @) _, f9 K- }7 I9 y& ^
import numpy as np
2 n1 v$ u) j, F5 V9 T; D
import pandas as pd
# q' c/ ^0 K' e( O; u
from pandas import Series, DataFrame
7 Q" i( v/ g1 x4 x3 n
#数据准备
: V2 I( D* u! p: Y
from sklearn import datasets
% T9 B3 U9 f6 A n2 b: F: C6 H% o
( P! k" U& v, s5 r
iris = datasets.load_iris()
( n! K; }- d* l8 V5 ^5 K
x, y = iris.data, iris.target
( e) @; B+ \/ v4 r2 O
pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
/ |& _9 R; @2 [4 T
columns=[
" v, a' k' Y- ~% {! _/ c* \* S- h
'sepal length(cm)', 'sepal width(cm)',
- V4 B( H- A) I; [
'petal length(cm)', 'petal width(cm)', 'class'
) }8 Q' q. [, H, ]& V4 f- Y' R, q
])
- ? K( r4 V% ^+ g
with plt.xkcd():
) Y8 B4 @9 O" J3 H5 E1 k# e; L
% u+ g" V+ z/ ~& H5 n8 ?: [
plt.figure(dpi=150) #设置图的分辨率
7 M& v9 l2 R9 H* K3 w" C
#plt.style.use('Solarize_Light2') #使用Solarize_Light2风格绘图
/ u. R+ ]& ^# a/ D) [8 W# o
iris_type = pd_iris['class'].unique() #根据class列将点分为三类
) t2 }+ _9 e4 N: }4 U( H6 [" f2 k
iris_name = iris.target_names #获取每一类的名称
( p0 c8 [9 p: i. d' q6 Z0 J9 T7 J
colors = ['#dc2624', '#2b4750', '#45a0a2'] #三种不同颜色
6 F1 G; ` P6 K9 f5 f1 T
markers = ['$\clubsuit$', '.', '+'] #三种不同图形
5 ]1 B$ f8 S& k/ D& [6 R* G2 ~+ l# @6 W
- o$ S' C7 z$ H( u/ p
for i in range(len(iris_type)):
7 _: O- H+ \" Y8 m# `$ r; H
plt.scatter(
) K' t; y! l4 x) F- |/ _7 ^$ S1 _& H
pd_iris.loc[pd_iris['class'] == iris_type
,
: u) S+ z! m4 k
'sepal length(cm)'], #传入数据x
8 T+ ] U% o' L2 f1 }
pd_iris.loc[pd_iris['class'] == iris_type
,
- K- B0 R3 R! v/ R% J) b1 a% ~
'sepal width(cm)'], #传入数据y
8 g- w3 p: A$ v( S
s=50, #散点图形(marker)的大小
; J7 s d1 |4 Q7 B( d! n7 \
c=colors
, #marker颜色
- B) G8 t% Y4 q9 a" ]
marker=markers
, #marker形状
* }4 C" G& K4 _2 J. T) m
#marker=matplotlib.markers.MarkerStyle(marker = markers
,fillstyle='full'),#设置marker的填充
7 {' }, e0 J; @! w- e4 v' U6 P' Y
alpha=0.8, #marker透明度,范围为0-1
- T: N' K8 w2 Y8 d, Z- f0 K( V# l
facecolors='r', #marker的填充颜色,当上面c参数设置了颜色,优先c
2 n* N# ~( ]; T9 C4 ?2 U
edgecolors='none', #marker的边缘线色
9 E2 ~" F$ Q& Y
linewidths=1, #marker边缘线宽度,edgecolors不设置时,该参数不起作用
2 }9 ~, ^; b: b& d3 ?
label=iris_name
) #后面图例的名称取自label
8 I- g# Z7 o% G1 `, y! q O
$ B% w2 k. n$ }9 T8 P! V
plt.legend(loc='upper right')
" c' ?- u" o, ~
S) |) i0 ] a
' [- t1 \8 ]% p' @( }% P
————————————————
5 u; M5 T, e/ `/ M. `$ M" a
版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
7 K$ j% H6 [. @, j4 A
原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
0 a2 @/ j4 ~) I$ ^
- p& B) ?, o- O% v
! K7 H/ t- [9 T1 C
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5