数学建模社区-数学中国
标题:
一行Python代码有多强,可让图形秒变「手绘风」
[打印本页]
作者:
杨利霞
时间:
2021-7-22 11:56
标题:
一行Python代码有多强,可让图形秒变「手绘风」
* k! }. c1 R: S$ S7 C
一行Python代码有多强,可让图形秒变「手绘风」
8 ^5 E! ]1 v: W' {2 ], d
之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
* }: h, p* x3 E! h- v3 y' M2 g
. l* x- H+ x& \
, O) a1 Y( N+ @; X
但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
& w% I, c0 Z, y) `% Z! y
3 D+ M" q& \- Z" ]
: [/ G \2 o, S+ Z
matplotlib.pyplot.xkcd()简介
5 W- J8 T0 S8 `9 i4 A" y" x2 H* I4 l
这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
# J- [% `9 Q3 r6 l2 \
# x" J5 m3 ~* v! _
* r9 R- K! |- J* Z
matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
! X l, w7 `; y$ D3 U# v
length=100, #褶皱长度
2 Z. t& u2 J" N2 p* R9 n
randomness=2#褶皱的随机性
( ^, I0 Q' I- d; ^6 k8 h% Y
)
0 h8 u; {0 w" i
matplotlib.pyplot.xkcd()使用
. d0 f8 V+ T4 l7 d0 Q0 m
如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
+ O# a) }/ B4 n1 f# _* s( w
$ Z) E) T, L* q# w8 U; d' f: o# I
h$ x" x0 N, m& ]; O3 ]" l
with plt.xkcd(scale=1, length=100, randomness=2):
0 e% O5 i! s" A
#with是临时使用一下,不影响其它图使用正常样式
: p% p# u, t- q2 B4 P
绘图代码
" Z+ ?' G, T7 X X4 a/ R
。。。。。。
/ {6 O/ v8 {9 ?* i
plt.show()
" ^/ ^4 W' ?$ O' i0 y% @6 t
matplotlib.pyplot.xkcd()使用实例
/ k; _1 `. F. W: T- [7 B5 s
下面代码为pythonic生物人公众号之前的文章代码
1 s* ^9 l1 X' T% o
0 K9 f7 U+ G8 h: [
) A z% Y4 }+ G; C: _2 Y
以下参考:Python可视化25|seaborn绘制矩阵图
1 T( y" T+ |- i
4 p9 p8 p3 {' z
- f; x O. L" p) w0 P. ~ Q6 `
#支持seaborn
( a3 x4 S' R* H) q8 N
import seaborn as sns
! k' O# V0 ?% u3 s/ B! G; P. M' |
iris_sns = sns.load_dataset("iris")
6 F& X* H- L' W* j. m" k7 x$ P9 ? r
with plt.xkcd():
, c7 V6 M; z) g ~* v. {
g = sns.pairplot(
4 _! U& Y3 g i; C2 p+ M/ z
iris_sns,
$ D1 v2 n g/ K' X3 Y: `
hue='species', #按照三种花分类
( C# S* b( V3 P* C
palette=['#dc2624', '#2b4750', '#45a0a2'])
1 K2 o5 E& l: P' n1 b" H
sns.set(style='whitegrid')
& I# h1 ~: X8 _+ h& |
g.fig.set_size_inches(12, 12)
( u& ] q' M6 `
sns.set(style='whitegrid', font_scale=1.5)
- X1 Z! F0 ?8 y7 c5 _; j3 s. a
5 B0 H" g# c7 o1 Z. W* @/ ]9 S
/ { U+ O. U# @7 ?
9 W k' a4 L, k0 T0 h6 c! B" D
以下参考:Python可视化29|matplotlib-饼图(pie)
J* a7 k) C+ \ i; U! Z
# B# U# ?9 b+ L! p* v
- p! L5 e# Y+ O- t: u$ |
import matplotlib.pyplot as plt
+ w- Z' d5 M% M! R" u$ B5 c0 I
with plt.xkcd(
0 T0 C8 I8 I4 I6 n( e
scale=4, #相对于不使用xkcd的风格图,褶皱的幅度
( ]/ ] ` z$ i. ]; g( a
length=120, #褶皱长度
9 i' g6 h! W# K: t: B3 j1 Q9 o
randomness=2): #褶皱的随机性
+ G- q8 j0 D+ N: |4 _1 M
plt.figure(dpi=150)
2 Q% C* T* ~" S* q3 |2 G8 ^
patches, texts, autotexts = plt.pie(
+ X1 c$ C2 C$ P1 T1 Y: Z
x=[1, 2, 3], #返回三个对象
: k8 C& n- T, Z9 n# R4 T8 Q; \
labels=['A', 'B', 'C'],
' X8 o* J7 q( e# P9 z
colors=['#dc2624', '#2b4750', '#45a0a2'],
7 g4 l7 {, S6 k$ e# w; ~$ w- r# q' A
autopct='%.2f%%',
0 U! d: j0 \4 T" M3 v
explode=(0.1, 0, 0))
3 `: A9 K8 B0 O0 @
texts[1].set_size('20') #修改B的大小
* F. C) \0 a* X
/ Y' _3 A0 x' k" A1 j
#matplotlib.patches.Wedge
9 P! W: d( Y& e% c/ U! V1 m8 @( V/ ~
patches[0].set_alpha(0.3) #A组分设置透明度
( K! H% s. U3 ~1 }- m, ~8 W" W
patches[2].set_hatch('|') #C组分添加网格线
- E) @$ b8 O& \4 o2 o
patches[1].set_hatch('x')
! o9 B; {" o8 E" w7 C+ H5 [4 w5 c5 g# f
% B1 m7 P& P4 ?. h5 \
plt.legend(
, n4 m: R A5 a# T; z y4 V
patches,
$ @ n8 O5 j* K- n9 F/ K
['A', 'B', 'C'], #添加图例
: u- F' ~) G8 ~8 P: v
title="Pie Learning",
L0 E9 [4 f# @2 y
loc="center left",
9 R' J7 n# w1 @8 z( |) |! d! |7 `
fontsize=15,
! g2 o6 f6 F2 W4 {# B2 V3 o5 O
bbox_to_anchor=(1, 0, 0.5, 1))
% U' T; N: B9 Q, p! D/ V3 d( s
3 P) P8 U9 K$ j8 y0 R
plt.title('Lovely pie', size=20)
p+ l! C4 h# ^
plt.show()
, K* N5 ~: a0 X. W- M* d
$ x/ }% O% h$ t' Q$ g
+ l k0 e& Z' W6 C: r \
) v& t. a5 K# e2 Z* ]/ O
" o& A3 T8 q+ }7 l! I
with plt.xkcd():
0 E7 U! T) ^2 M- _
from string import ascii_letters
% {: t- |& v9 Q [) s
plt.figure(dpi=150)
, L. J5 B4 }& | U' ^8 v5 H
patches, texts, autotexts = plt.pie(
( E4 A( F9 ^ L$ C" G
x=range(1, 12),
% |0 l5 \$ ~! O# {$ t* b
labels=list(ascii_letters[26:])[0:11],
8 f( X K3 o% x: A; `5 s( i( }
colors=[
4 X# S9 H( W a* y" P0 t, B" [) b3 G
'#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
9 t8 D; `+ q- w7 r: s; `
'#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
! S3 u1 v. g( d% ?* C/ a6 w% V& }
],
4 ?; D' x9 C; \ o; ^. z
autopct='%.2f%%',
! {" `3 J$ _5 o1 w( s: W+ ^2 m; u
)
4 C `$ J6 C4 z8 z& x* X
plt.legend(
( ? n3 J' i- a. G* q7 ~9 c" q1 i- q% ?
patches,
( v3 w7 y( m* q2 C+ t1 n
list(ascii_letters[26:])[0:11], #添加图例
( t2 r5 x" W! ]7 a
title="Pie Learning",
* W% I3 W, l: m4 x
loc="center left",
0 ]0 ~% s B2 v$ ]* L3 ^& j
bbox_to_anchor=(1, 0, 0.5, 1),
7 m6 P' x4 J4 K, S6 e% Z# u5 F
ncol=2, #控制图例中按照两列显示,默认为一列显示,
9 h, P5 }, T$ J* m/ `; L& ^8 N3 r' ?
)
$ k: J2 c( F, \
C7 {+ H f' G% Z+ O) u
s$ }+ E; z& I2 \
6 e& Q$ ], r( U- X
3 Z; K2 Q- \* b! ~! }* D
import matplotlib.pyplot as plt
% Y @* \+ O D, C$ t3 D1 j
import numpy as np
& O$ T: f+ y4 Q( {2 I! p6 D0 F3 L
with plt.xkcd():
# U: _! R9 @! P. [
plt.figure(dpi=150)
$ _ s( ^7 P6 Q/ ? A
labels = ['Jack', 'Rose', 'Jimmy']
$ m9 C2 S$ R/ A3 |7 B# j! Y/ q* b
year_2019 = np.arange(1, 4)
* s( j! \+ b6 _1 k# t
year_2020 = np.arange(1, 4) + 1
8 A: A, Y; n2 v2 H4 H0 D
bar_width = 0.4
+ c) Z5 V2 E5 x/ w8 O
" J+ p4 v* M3 G2 |% P8 h
plt.bar(
; m1 J" b# ~2 ?* [/ Q
np.arange(len(labels)) - bar_width / 2, #为了两个柱子一样宽
# h' L/ d ~. }9 T
year_2019,
[3 G `' q: B+ X) j
color='#dc2624',
7 Q. M2 R# w# f6 K: A( f0 x& y) Y
width=bar_width,
7 c# R8 q! W6 a( \2 }2 c6 h
label='year_2019' #图例
8 z" N5 _! ?/ f" \+ X& C4 y
)
) u! ^ W4 X- V3 Y& B3 W
plt.bar(
; r6 n. l4 r% O8 t3 K) N: l$ N6 _
np.arange(len(labels)) + bar_width / 2,
2 I- ^2 H4 J6 g% D: B$ }
year_2020,
" V* e5 Y% m: {$ e7 S/ W
color='#45a0a2',
' e; T( ]: @$ i5 h/ A- d1 [
width=bar_width,
" C' M5 `. P) M1 Z& E9 F. E/ v
label='year_2020' #图例
4 X. D0 Z! [' ]9 t: z' W# L4 z
)
9 O& r+ k8 I* _* Y! E
plt.xticks(np.arange(0, 3, step=1), labels, rotation=45) #定义柱子名称
& H- a% `# @+ v& Z6 B/ t" `2 W
plt.legend(loc=2) #图例在左边
( _7 y- o# O6 n
以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
' l; q& e! s6 G& _, V
! ^' @, s% {: u; d. A, ?0 y
6 h/ g' C/ t. l& y" E. o; b, x$ b: d
0 T+ P; K. \; w( J, t R$ W/ O
3 l- C0 `# v/ Y/ E( ?* X
& `* H* ]- b, I8 ~
$ K4 a/ ~% \( {% i
以下参考: Python可视化|matplotlib10-绘制散点图scatter
) X% k# N* O! e0 h0 F- m+ \/ v9 p* |
0 o) h8 \9 q/ g+ G7 l, k
2 e6 L3 a- {5 F, s! p4 @# e6 x
import matplotlib.pyplot as plt
5 a1 v* O4 |( d4 P% Z
import numpy as np
7 U% V# d8 F9 j3 W
import pandas as pd
7 G) o# i& [7 h/ g* N% ] s
from pandas import Series, DataFrame
' F7 M" a& [% u. T% T0 w; [
#数据准备
$ _3 H$ R6 \" ~" N
from sklearn import datasets
; R% Z$ c' a$ \/ S s
1 e4 c. [0 d0 z: B
iris = datasets.load_iris()
2 Z, t. r, d! R {
x, y = iris.data, iris.target
) o- b8 S$ d6 e$ n- n! H A
pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
( Q- r: @1 D) ]8 y( I" M
columns=[
" G8 |0 w% |4 B9 D" {( L
'sepal length(cm)', 'sepal width(cm)',
9 @: P* m0 X* W( C1 f2 ^5 G) T
'petal length(cm)', 'petal width(cm)', 'class'
/ C& d) p( g7 U$ s4 f
])
! D8 r; z1 H; p: f
with plt.xkcd():
. M$ b, Z$ ]( E8 C$ S( r
- p( {$ T0 F4 F7 c7 Z
plt.figure(dpi=150) #设置图的分辨率
2 t/ j: ^- m5 l7 ~: V7 Y. e
#plt.style.use('Solarize_Light2') #使用Solarize_Light2风格绘图
& y2 I0 B6 q* X+ J5 ]5 X
iris_type = pd_iris['class'].unique() #根据class列将点分为三类
0 E) T# P8 L2 V% j9 F# N }& H
iris_name = iris.target_names #获取每一类的名称
' t8 X9 |. c9 U8 [- [; U" P
colors = ['#dc2624', '#2b4750', '#45a0a2'] #三种不同颜色
* w1 |; J, B& A- G
markers = ['$\clubsuit$', '.', '+'] #三种不同图形
6 U" J+ V2 z; R* b D& E0 ~
! r+ L( H9 z; a& r
for i in range(len(iris_type)):
1 R3 K0 ~9 Y7 o, G2 o
plt.scatter(
' D8 m% F6 {2 d
pd_iris.loc[pd_iris['class'] == iris_type
,
. j( t+ A) l. X
'sepal length(cm)'], #传入数据x
$ m- e3 N" | Q1 E$ f) O" N
pd_iris.loc[pd_iris['class'] == iris_type
,
# }5 J4 s3 \; H' F
'sepal width(cm)'], #传入数据y
+ C4 y* f; X( j2 V) Q' p5 @
s=50, #散点图形(marker)的大小
" [1 C) f! K' A
c=colors
, #marker颜色
% r3 `" U# @9 l9 v/ P8 x
marker=markers
, #marker形状
" q6 e! I4 c7 ^8 f$ N& b) e; d
#marker=matplotlib.markers.MarkerStyle(marker = markers
,fillstyle='full'),#设置marker的填充
1 B8 }& t% B3 Z2 B) p7 u7 h: j
alpha=0.8, #marker透明度,范围为0-1
1 r! ]1 K, b3 \
facecolors='r', #marker的填充颜色,当上面c参数设置了颜色,优先c
5 }2 ^8 [: e. s8 Z' s/ v
edgecolors='none', #marker的边缘线色
7 V; D% ?' c- p; N. n
linewidths=1, #marker边缘线宽度,edgecolors不设置时,该参数不起作用
$ o0 }( A1 N8 I( C7 r9 t
label=iris_name
) #后面图例的名称取自label
) O+ X; a( X. u7 c- h* S/ W
1 l% U7 f/ v9 o3 i* |2 I" q
plt.legend(loc='upper right')
) [4 h; a* M4 S" R
. G, R. d& X) a
5 R& E4 W$ N# T
————————————————
) N" \& z. f% s z) d
版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( Q+ J3 |7 H; a1 G/ s% f) N
原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
1 _( Q' k! F3 |" G& G5 ?# _
/ z. P* N3 G1 n$ L2 B
3 X) [6 ^- Y0 G1 V
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5