数学建模社区-数学中国
标题:
一行Python代码有多强,可让图形秒变「手绘风」
[打印本页]
作者:
杨利霞
时间:
2021-7-22 11:56
标题:
一行Python代码有多强,可让图形秒变「手绘风」
) `+ o8 Z5 S, M* _/ M
一行Python代码有多强,可让图形秒变「手绘风」
& q4 p7 l. [+ ^5 R) c
之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
" h$ Z/ L1 }. `: t% y( B* y
/ \/ P2 b t! X& x) j! @' z: R, _
5 G! u8 G6 o2 \" w
但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
( ?. l$ f0 v: l4 Q
0 Q% }) `' d" b' G4 u4 r
6 \% u7 Z! r3 U( B8 ~6 i7 p
matplotlib.pyplot.xkcd()简介
- \& z$ N2 v# G
这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
% ~& ?+ G' {8 a) [2 K0 ?
% }: S0 p6 E$ \* Y
0 S; P# @3 r0 A; v
matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
: t- x; H+ C/ j+ L6 Y
length=100, #褶皱长度
6 H% I* |( q4 [( }8 u( Y
randomness=2#褶皱的随机性
. f' m0 `* e2 R/ f
)
2 v f9 |5 L, n9 q0 R
matplotlib.pyplot.xkcd()使用
, f! m. x! p2 M# c- C
如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
# @0 W" ?# i S5 V+ F
" g7 E- L% }/ A( H( y3 X
$ @+ e. z) l- e4 y, y' z4 h7 O6 _
with plt.xkcd(scale=1, length=100, randomness=2):
; b6 K$ ]# e5 a5 G5 @
#with是临时使用一下,不影响其它图使用正常样式
! M8 q1 [) K2 f6 V; B' p
绘图代码
$ d: z; ^0 U: P H- Z# E
。。。。。。
6 H0 z4 w2 w6 n+ i! V- [' E. ?
plt.show()
5 H8 C5 w1 z. ]
matplotlib.pyplot.xkcd()使用实例
/ b7 ^* z5 @4 X' K: p- I1 x
下面代码为pythonic生物人公众号之前的文章代码
. `" |) I+ u6 m8 |2 a, \8 s" k
& Q; z2 @/ P9 A& x3 ~# U
6 z. c/ S2 l! H; R
以下参考:Python可视化25|seaborn绘制矩阵图
/ H# d8 E! k. p6 _. f4 r$ Q
/ v! W/ E% b+ n6 J- n* |
% O. I; U* l7 d( ~* }1 {
#支持seaborn
8 |3 A4 g& c( A8 G; i6 r
import seaborn as sns
5 ?* f! w6 l1 M$ u5 j) y9 Y, o
iris_sns = sns.load_dataset("iris")
9 p9 K! ~) m/ `- e7 D7 b8 e
with plt.xkcd():
8 w6 s# \2 ?3 D+ K* K$ A7 P+ m1 g# Z
g = sns.pairplot(
+ `5 n! d( {+ ?
iris_sns,
/ h$ m2 b: p0 i# o+ J$ {1 d
hue='species', #按照三种花分类
# `3 N3 F5 n- k1 J: w
palette=['#dc2624', '#2b4750', '#45a0a2'])
) Y' n$ ^; j8 \9 G
sns.set(style='whitegrid')
+ c* }3 W( E7 ?! y
g.fig.set_size_inches(12, 12)
- S' \ Q8 L$ C) D
sns.set(style='whitegrid', font_scale=1.5)
6 U% M2 b9 b: q9 x. s- P: y2 F& r
; C* P. j. d( i, h' O3 M( P2 `! b
8 S2 J. F7 }, Z
8 G4 f1 n0 s3 N
以下参考:Python可视化29|matplotlib-饼图(pie)
, d( ?+ S- ^! y5 v- B
% u' a( I; \1 D! ~0 |
- O1 w1 |* A( S2 m" O9 L+ F
import matplotlib.pyplot as plt
, b2 ~) q: P: W. q1 p6 F4 Y: f
with plt.xkcd(
& S! k' O( n/ M4 B
scale=4, #相对于不使用xkcd的风格图,褶皱的幅度
% o3 D5 _ w3 [4 B% t
length=120, #褶皱长度
6 v1 Q& C- [, J' U
randomness=2): #褶皱的随机性
3 ?" o: d9 P( d8 x4 i
plt.figure(dpi=150)
0 i% D* b' ?& L$ p- Z' b" d: ^
patches, texts, autotexts = plt.pie(
2 F: k9 J- z7 t! l
x=[1, 2, 3], #返回三个对象
5 R7 s( g/ z# ?2 i
labels=['A', 'B', 'C'],
7 b1 X- d5 C; [* D. {
colors=['#dc2624', '#2b4750', '#45a0a2'],
( ?% V' O. ], F' T$ {
autopct='%.2f%%',
! ^9 r# C" j/ p3 D* Z
explode=(0.1, 0, 0))
/ D% t9 r, j6 m5 m
texts[1].set_size('20') #修改B的大小
) ]* t# h, J& p9 V
$ ^3 i* Z' H* p! F8 L8 S6 L" P. Q
#matplotlib.patches.Wedge
3 l. M% ] {9 w: d
patches[0].set_alpha(0.3) #A组分设置透明度
+ t0 H9 Z( y @2 a
patches[2].set_hatch('|') #C组分添加网格线
4 g" N% N0 B! }* `' H( p8 J
patches[1].set_hatch('x')
$ T2 i! D$ I2 [! n" s3 B* y
( L8 `1 K0 a/ }2 p+ N7 O
plt.legend(
* {8 G1 Q) u) Z! ~7 @) s
patches,
$ J8 V1 A. e; A6 L; p4 t
['A', 'B', 'C'], #添加图例
" K2 ?0 A! q3 T( R3 {
title="Pie Learning",
2 p) }( y$ r2 D
loc="center left",
' {: A! a4 f* F# E$ v
fontsize=15,
8 J( _- Q v1 |* u/ G5 }* g& @/ ~
bbox_to_anchor=(1, 0, 0.5, 1))
/ X4 ?! j) B2 t. @( l4 S% b) Z
9 V [5 m& I8 g3 _/ D1 W
plt.title('Lovely pie', size=20)
- H2 B+ y7 X/ i% K: Q$ m/ d
plt.show()
4 s' o H! y9 @* G. G
4 P5 t/ r+ J0 [$ H7 k7 m
* k2 _; N% m# b: T ?3 {6 ]
. q8 y9 N, k" K% ~- [& ^) u' }
2 X0 Z0 g; K) Q* w& j/ t* `
with plt.xkcd():
5 {6 y# O: k% } d9 O+ T0 J/ E2 d
from string import ascii_letters
: U7 u& S- o3 ]: O& z# [
plt.figure(dpi=150)
6 |- {; Q+ K' [$ @' d5 u
patches, texts, autotexts = plt.pie(
6 K; I( P5 b1 m
x=range(1, 12),
. _9 `1 v$ q+ ~* M
labels=list(ascii_letters[26:])[0:11],
, p" T4 K) q5 r: ]* y. d- R
colors=[
8 P6 a H+ N- l9 x7 y- r* T! c
'#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
6 m% k' x3 F5 W9 m8 q7 U# O/ q
'#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
7 {) J: ~3 K! R! y
],
4 f. S2 }8 S! }; e# @2 I
autopct='%.2f%%',
5 _" J5 ^/ L1 _2 y8 R
)
0 K2 u( w- h5 @2 i7 C- O: D3 ?
plt.legend(
1 I1 D4 ~) W: S; O: ]" l R$ H3 K
patches,
1 ^5 M# _# M: F9 L
list(ascii_letters[26:])[0:11], #添加图例
5 F+ f8 j( }" u" Y( J6 z' |
title="Pie Learning",
W) G( D7 W1 u0 W$ U
loc="center left",
0 K; P+ s* E" }
bbox_to_anchor=(1, 0, 0.5, 1),
/ P" c# \9 b* |. u2 i- @( }. P
ncol=2, #控制图例中按照两列显示,默认为一列显示,
5 i0 _ W$ K2 M0 W' z6 Y# d ^
)
% a1 p5 m4 l8 ^% ~4 S* _0 }
' X3 p& u) v! P9 j$ D- ^5 G% Y( k
0 O- I0 Z: T1 r4 `. \7 u9 f
$ R1 Z+ i* @' c- b
( d% n0 e# X2 Z5 T
import matplotlib.pyplot as plt
# I7 u8 L o$ P' q, I) O! Z! |# B
import numpy as np
: ?0 @) H% q0 }& s% Y, v4 O
with plt.xkcd():
4 l1 F9 w' C" h- Y6 H; I
plt.figure(dpi=150)
H. x' r+ O \) X+ \" |
labels = ['Jack', 'Rose', 'Jimmy']
! S# m6 \+ A- p, n$ z2 W" v
year_2019 = np.arange(1, 4)
3 O0 p' ]& O8 E$ _+ [# y; `6 c
year_2020 = np.arange(1, 4) + 1
6 [: n* }2 J6 C9 G5 D
bar_width = 0.4
3 ^& w4 a9 U0 I: `# i
1 d$ K% D/ o- }7 }# A5 W
plt.bar(
$ a m5 ]; j+ ]4 @
np.arange(len(labels)) - bar_width / 2, #为了两个柱子一样宽
# q+ V2 f( L5 w' K, a
year_2019,
1 m$ c% e- C; |! A0 ]' a7 v; w
color='#dc2624',
( i9 `6 U3 t/ D: _2 \+ |' T8 f6 [. I$ i
width=bar_width,
5 Z6 Y, [1 E+ p$ q" T/ B+ x
label='year_2019' #图例
7 ]3 v+ r! P' a' U: y; u! x& M
)
" k7 _" l; z8 V5 u9 K% a- r
plt.bar(
! K* ?3 E3 N9 q% }2 P
np.arange(len(labels)) + bar_width / 2,
0 T; n9 S N: [- Z( g$ N: E
year_2020,
1 U- E' v$ l* K9 A, E2 v
color='#45a0a2',
- u7 d1 {+ s) s" W: n" v/ q
width=bar_width,
( ]7 m) q8 H" g- W! R2 u
label='year_2020' #图例
* [8 i) S' ^& s; N& r
)
# M3 n1 z+ y7 p0 I5 j. D/ T1 J
plt.xticks(np.arange(0, 3, step=1), labels, rotation=45) #定义柱子名称
* }/ }! E% ?8 z& N$ q8 n' s
plt.legend(loc=2) #图例在左边
7 h: H! F6 z! J0 \( M/ M7 ^
以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
3 l/ H- A* X5 W: C9 u8 q
& f1 l9 i" X0 G' e3 x" }9 \+ N
# X' R# K' r+ m0 v0 r; y
* h7 r. x+ `7 X, k
: X: i: T( [& O2 G% t/ Z: |! c
0 r4 N/ y$ O- K8 D
. w) o$ Q0 Z7 I, a2 ^, B1 u
以下参考: Python可视化|matplotlib10-绘制散点图scatter
, M( d$ X6 s8 G7 X
, J2 _2 b# L. t
, a. P$ r* N! W+ F, |$ e
import matplotlib.pyplot as plt
: O& G7 e8 d. e, g: H
import numpy as np
5 H) b5 N5 g8 q4 m% m
import pandas as pd
( Y, `0 U( q! D( [# F
from pandas import Series, DataFrame
* S$ M* d4 h, `, E
#数据准备
1 R4 q: [% J- r( O2 a# j4 `
from sklearn import datasets
4 D2 i/ n# S* a! a. }1 I
- K4 W, i* k; ?" s% o) r
iris = datasets.load_iris()
" ~% O+ @7 s, G
x, y = iris.data, iris.target
$ N# M5 `1 [0 b$ L4 q3 F) L5 }
pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
- a3 F8 Y" @) l( \ s$ k& z( v3 l: F
columns=[
5 w! s" d- H' \& s3 l) U3 \
'sepal length(cm)', 'sepal width(cm)',
2 Q6 x V- y$ ~; h( q% J/ R1 K
'petal length(cm)', 'petal width(cm)', 'class'
$ E8 W0 H: q9 |5 r$ `( e
])
% E: n3 X$ k% R$ M. l: X
with plt.xkcd():
& ?5 \; p. M( v1 N" Q1 t9 I
q/ ^) L1 S9 y6 y; U* W0 J) V
plt.figure(dpi=150) #设置图的分辨率
0 L, g6 e0 t/ Q( K+ F
#plt.style.use('Solarize_Light2') #使用Solarize_Light2风格绘图
; F9 ~5 z* D: h2 K- U
iris_type = pd_iris['class'].unique() #根据class列将点分为三类
3 c, b: l% w7 q) D4 p
iris_name = iris.target_names #获取每一类的名称
8 G" C! Z, w) l
colors = ['#dc2624', '#2b4750', '#45a0a2'] #三种不同颜色
: @; e: C. L/ A$ v# x& m
markers = ['$\clubsuit$', '.', '+'] #三种不同图形
/ z9 r" M2 Q e) z7 y# b' k
2 L$ T; R7 q8 v4 B9 H1 m9 C
for i in range(len(iris_type)):
1 G% Z# [+ O. t l
plt.scatter(
" o9 {; }1 u/ x n
pd_iris.loc[pd_iris['class'] == iris_type
,
2 H: I ]; ^$ B- P
'sepal length(cm)'], #传入数据x
1 g$ Q/ {% A" [4 i
pd_iris.loc[pd_iris['class'] == iris_type
,
5 V* }/ y8 T, Z' e' O) R
'sepal width(cm)'], #传入数据y
% [. n# p+ u, G, I
s=50, #散点图形(marker)的大小
# ?; |/ H, E3 Y" S5 H- B8 m
c=colors
, #marker颜色
. A& Y+ e/ L! K. {6 w
marker=markers
, #marker形状
% I" ]+ U6 w) b9 a8 ]% z- I' {+ u
#marker=matplotlib.markers.MarkerStyle(marker = markers
,fillstyle='full'),#设置marker的填充
. v* C/ y% c6 c& @9 _9 z, G
alpha=0.8, #marker透明度,范围为0-1
& y# U; T( W3 f) U6 {- i
facecolors='r', #marker的填充颜色,当上面c参数设置了颜色,优先c
- Z4 t+ E8 b0 p/ y1 r- d+ S
edgecolors='none', #marker的边缘线色
D7 B% A h0 t% t
linewidths=1, #marker边缘线宽度,edgecolors不设置时,该参数不起作用
5 B; |2 F/ Y1 _) V7 {4 x f6 g* W+ S1 T6 S
label=iris_name
) #后面图例的名称取自label
5 e, i1 q' n" F6 b2 Y1 C+ b; f
6 w( j; w7 c( w
plt.legend(loc='upper right')
& Q) }2 i% v" c+ d' V3 S: p
2 h2 C4 [6 N: @) t& m
8 K; M6 m* U1 i3 J; }2 o
————————————————
: s* G, S/ q, N! a5 k. n
版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: w! I9 j* H2 c2 u9 m2 W' j3 ]
原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
/ T5 m. O0 t( \ W2 @9 _1 J) Y; S
3 @, p# w) e# F6 v
. a6 M$ ?9 F: P
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5