数学建模社区-数学中国
标题:
一行Python代码有多强,可让图形秒变「手绘风」
[打印本页]
作者:
杨利霞
时间:
2021-7-22 11:56
标题:
一行Python代码有多强,可让图形秒变「手绘风」
- ?8 l( N& h7 d! j: q3 m- e6 m
一行Python代码有多强,可让图形秒变「手绘风」
3 Q" n- g" n7 q- \
之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
5 q& H2 l7 O6 X- W/ O3 _( l
7 t4 b* G8 u: s; _
& r1 k* X/ W# L
但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
3 F' R! Y2 C/ I2 {
+ }0 b$ t" X$ v& m5 ]% k% T
: B. D. U' C! R, L" N4 I
matplotlib.pyplot.xkcd()简介
+ l3 `+ z) Q' {$ P% r8 a
这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
$ }6 o6 S9 k! m
5 Y% F/ c: k7 U0 q7 ]: M
6 z$ \. p. ?" w( Q: v
matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
1 P3 O. Z W% S! w) Y2 C
length=100, #褶皱长度
; U w" ~" W- \3 H$ @% m& z4 L
randomness=2#褶皱的随机性
7 W( ]1 R7 S. H4 q
)
8 g4 \8 l- }6 H; ]/ V7 x) n
matplotlib.pyplot.xkcd()使用
" t+ e D) y7 D7 D0 ^6 c2 j
如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
, o4 y- ^3 B- G6 v' F' S1 U3 g: ?8 P3 K
6 L4 `2 O0 q. ?8 U2 L; c
, \9 o7 _# D5 g7 ?: `' c& r4 [9 o
with plt.xkcd(scale=1, length=100, randomness=2):
6 l( i( @0 S: {2 F0 p+ l* r
#with是临时使用一下,不影响其它图使用正常样式
, f/ ?- c0 C$ x3 E+ j1 O2 j( C
绘图代码
7 N, K. d7 ]. Z; y. q
。。。。。。
1 K8 L% m# E1 _# A
plt.show()
/ z8 I+ Q, t3 @ x9 n9 y
matplotlib.pyplot.xkcd()使用实例
+ H/ g) _" X2 B9 y2 `! e
下面代码为pythonic生物人公众号之前的文章代码
r7 N. V2 v4 B( s) d$ S
! u0 h0 y- Z) X5 j
$ \" L$ s8 U2 `$ f I& d
以下参考:Python可视化25|seaborn绘制矩阵图
9 p5 ?4 w" g" M# O& c( g' Z
+ W" l+ t0 j Q, r) ^
7 E L+ X& J H* V" m4 L
#支持seaborn
& n5 ^% P `8 `5 ~1 r+ y% f4 P
import seaborn as sns
* F+ d, h# h# v' b) s7 q! n/ ?. R. j
iris_sns = sns.load_dataset("iris")
! x8 o4 U. w& s( X) \
with plt.xkcd():
8 {+ x9 s% f' t5 _
g = sns.pairplot(
0 [+ Q5 t, r' o$ c, ?. J
iris_sns,
' X \6 k! _+ C9 z4 V7 P
hue='species', #按照三种花分类
# I, _0 h" O- a
palette=['#dc2624', '#2b4750', '#45a0a2'])
9 F% z1 K7 p2 Y& D5 y1 j. v
sns.set(style='whitegrid')
0 C Y9 N8 {* N8 h# s) M' q- x' F1 p9 e
g.fig.set_size_inches(12, 12)
# U5 v" r* y! a' _- x2 c+ W
sns.set(style='whitegrid', font_scale=1.5)
+ r) I! o* X) x
& X( X- A( H! j. u" @$ O
& [, r& S( i# v5 k1 a: \( J
( c( f( z$ L% W! V
以下参考:Python可视化29|matplotlib-饼图(pie)
% H" V2 S& y$ V" `- [' v; Q8 ^! n
( t8 d% G5 W2 W' I' h
$ Q' [( U2 Y2 s- B3 a, g
import matplotlib.pyplot as plt
: ?. |5 M& a3 h
with plt.xkcd(
2 V2 @) O8 y9 D# q% e5 |( a4 j; m( M
scale=4, #相对于不使用xkcd的风格图,褶皱的幅度
2 c: Y0 x2 l6 D; m0 S
length=120, #褶皱长度
; _6 b1 s. P3 b5 `2 v
randomness=2): #褶皱的随机性
6 E, z5 J0 W- O5 f A
plt.figure(dpi=150)
7 F' B, _, G. v4 M
patches, texts, autotexts = plt.pie(
& B) r) c0 Z7 S4 a. F; ]7 a
x=[1, 2, 3], #返回三个对象
7 b. X- d7 Q6 f
labels=['A', 'B', 'C'],
% Z4 h" z( w" m( _2 c# Q2 L7 T
colors=['#dc2624', '#2b4750', '#45a0a2'],
4 K& I4 Q5 N! O( {
autopct='%.2f%%',
8 Y$ U$ b& l/ } f: ?+ z8 _
explode=(0.1, 0, 0))
: @" w. I: ^& Q
texts[1].set_size('20') #修改B的大小
0 s5 b3 V9 \3 G3 t- K" L+ v7 j3 y: D
0 q9 T! a) i/ p. K# G/ _
#matplotlib.patches.Wedge
3 A: Y. k! N* y, V# {6 H
patches[0].set_alpha(0.3) #A组分设置透明度
* ^& _) E2 l) C& ~ Z# R2 u# X* u
patches[2].set_hatch('|') #C组分添加网格线
. Z( Z7 P# t" C9 A3 a2 I, ~
patches[1].set_hatch('x')
# w: H" M5 S: R2 a2 g5 d
$ ~1 q4 l* ?8 z/ F- }
plt.legend(
) J$ J4 T5 `; H; Y2 Z+ M, L
patches,
, {3 u! e( M8 F
['A', 'B', 'C'], #添加图例
( P& R5 y: u- N3 l ~7 I
title="Pie Learning",
" R; Q9 c0 ~. A7 e1 f
loc="center left",
, C5 V9 f8 C u
fontsize=15,
0 B/ ~/ i0 F1 ~0 G+ i7 N" ^5 R$ H
bbox_to_anchor=(1, 0, 0.5, 1))
4 h. E+ s; i9 G) h( p
: W9 S% b7 S& F1 }
plt.title('Lovely pie', size=20)
" l; ]! Z# _3 e4 b# z
plt.show()
' H% O. T1 D, C
& G0 C; P* K9 ^! _
& F# _- b. r" c8 Y
/ i! w4 H( U9 V' p0 U
0 C C* d! |# @+ `8 v- J
with plt.xkcd():
& j6 }& S0 d/ _/ t5 w0 y: ?5 \
from string import ascii_letters
( H+ L% }7 f# e( f5 \( v
plt.figure(dpi=150)
( f# |0 A# a' \; J; I
patches, texts, autotexts = plt.pie(
+ \; t9 U. o5 A. j# u
x=range(1, 12),
" B& T. o' d2 A& r. y% X g7 d1 H
labels=list(ascii_letters[26:])[0:11],
9 I7 Q5 ~3 \) I2 ~- E. L2 z9 G; o
colors=[
/ d- c' T8 ]; a- j8 y
'#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
$ J0 m7 O1 {' t) j9 m
'#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
6 O) k* L0 C- \) G6 E
],
: {" f: H% j/ s, B" T
autopct='%.2f%%',
- |3 w1 o7 h+ m6 N
)
7 n: U @7 p6 f( R0 p
plt.legend(
+ b% |0 _) D& G( G+ @% k: \
patches,
! B0 _8 r& v! E( T+ m- e0 W8 o
list(ascii_letters[26:])[0:11], #添加图例
9 v) _6 M7 V9 [# ~' h
title="Pie Learning",
1 j' u/ y$ {3 ^
loc="center left",
$ u/ r# u2 l9 Y3 J
bbox_to_anchor=(1, 0, 0.5, 1),
# g& a0 o8 U, d1 q+ m
ncol=2, #控制图例中按照两列显示,默认为一列显示,
2 [. P! |: f: S' H- l
)
7 o0 q# I4 d6 S9 |" P4 \
5 @+ Z" ]0 z% X7 b- v, G0 L
; l7 H- d: i3 S3 a. u4 R9 a
/ {9 V4 r0 j+ W
7 v. M9 H1 q+ ^8 R% X+ _
import matplotlib.pyplot as plt
& V1 E4 l3 \. y7 y, W
import numpy as np
, s7 z& W# z$ O& W$ G `
with plt.xkcd():
8 Q# w: y9 v2 D" v! Y9 s, S# I
plt.figure(dpi=150)
, e3 e% e$ C# {! ], I
labels = ['Jack', 'Rose', 'Jimmy']
$ Y2 O+ j6 p8 X; c
year_2019 = np.arange(1, 4)
5 J/ S8 _: U' [
year_2020 = np.arange(1, 4) + 1
* F% X' ?3 W* [. F- J1 Q. b
bar_width = 0.4
* a$ p. J6 B, P3 l3 P
2 U6 {4 J' G0 T4 v
plt.bar(
% g7 C: c' G7 k2 O8 c' E: {5 ~" Z
np.arange(len(labels)) - bar_width / 2, #为了两个柱子一样宽
g; `3 t* E+ P( S' G( a- p
year_2019,
3 u# h3 z' E4 U- k- N
color='#dc2624',
* P" B; X& B# [& S4 P; {
width=bar_width,
6 j! h0 y+ `1 V* e- c
label='year_2019' #图例
# p) T* f% f2 M9 V! p
)
# z; c: D/ z5 S- S9 F
plt.bar(
S" d* ^, b" k4 i$ h8 ]
np.arange(len(labels)) + bar_width / 2,
9 @( d0 @' @6 b$ N
year_2020,
6 n4 m4 M7 T' T
color='#45a0a2',
( e, \6 Q) Z/ M0 {! F
width=bar_width,
: k2 U& m+ p/ Z ~2 _- @- }
label='year_2020' #图例
! L% ^: l0 ]; f6 I0 b3 s
)
9 h4 s$ [! G& J
plt.xticks(np.arange(0, 3, step=1), labels, rotation=45) #定义柱子名称
8 i8 d. ~$ Z% Y
plt.legend(loc=2) #图例在左边
( t2 X! Y6 `, ]: M, V) t1 V; z
以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
y0 m' y% m9 t3 K3 D7 S1 E
4 C* J9 p9 j' T6 d, K% {3 H, g
; c- \0 n$ L: D1 X. h+ C
+ A; @, _: E. z! B ]" U
/ I% F D/ h8 D, f1 `! v
0 \# n8 P8 f6 h {( p! |
( L8 G, P- W4 N1 D! R
以下参考: Python可视化|matplotlib10-绘制散点图scatter
7 ~0 G! l8 `- v/ v& o% j1 F; O/ `4 _
, W5 l, ~( j4 f, K
- ]0 c# d9 ^3 k+ L, o; Y$ k2 W& p
import matplotlib.pyplot as plt
* K1 L F" J1 B# r! i
import numpy as np
( S: @1 \+ L! W2 r2 a: _
import pandas as pd
" c7 l6 s. e M2 J6 i$ p" l
from pandas import Series, DataFrame
% z& Z$ c$ j: i/ U& F& {
#数据准备
/ K9 h- `) G9 _- p8 q* \
from sklearn import datasets
# M9 ~' @3 M* E
/ Q" ]+ t8 u; t7 v
iris = datasets.load_iris()
) ^) j9 d+ i6 L
x, y = iris.data, iris.target
' y7 B: w" |0 j; d: i1 V
pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
* \2 [& `, o9 C. [3 A
columns=[
4 l9 [# Q& j+ r% W3 D+ c) }& U1 Y
'sepal length(cm)', 'sepal width(cm)',
5 W; N/ o1 m" g+ V; T
'petal length(cm)', 'petal width(cm)', 'class'
0 R9 h/ l+ |% S
])
. u- j( l: M4 {2 _: ~7 L; h1 c3 P
with plt.xkcd():
# V, h. S1 X( A- J7 K8 d, s
9 f5 H$ J" T3 o* ^" m
plt.figure(dpi=150) #设置图的分辨率
7 z0 B" B$ D0 a9 I ~
#plt.style.use('Solarize_Light2') #使用Solarize_Light2风格绘图
$ K( N2 Q, X- d3 J( b
iris_type = pd_iris['class'].unique() #根据class列将点分为三类
; a X6 e P- Q6 \2 d! F
iris_name = iris.target_names #获取每一类的名称
, z( Y: S. f8 N" K7 r7 B
colors = ['#dc2624', '#2b4750', '#45a0a2'] #三种不同颜色
5 y4 ^" V( |' Z7 |' o" H9 p# b) E
markers = ['$\clubsuit$', '.', '+'] #三种不同图形
2 ?; l) U. r; }' M) u" _* \
$ G+ A$ w3 X4 t4 U! k0 V
for i in range(len(iris_type)):
3 n. _9 S( J% |5 c6 ^
plt.scatter(
3 `# C) e- W6 I6 d& J: \/ ^* M
pd_iris.loc[pd_iris['class'] == iris_type
,
" v/ T' `' ^. s: ]! h6 t4 s7 ^
'sepal length(cm)'], #传入数据x
3 k/ i" R7 p& [( L' q) b6 Y
pd_iris.loc[pd_iris['class'] == iris_type
,
- W/ c$ l; }6 y& a7 x
'sepal width(cm)'], #传入数据y
& Y( c- Q) d$ W; P/ e
s=50, #散点图形(marker)的大小
* c: e$ }- v1 v9 L' G6 F
c=colors
, #marker颜色
. j' p0 Z. Z( V5 A% b- j
marker=markers
, #marker形状
B# I! ^# r5 t6 z4 e" G8 ?
#marker=matplotlib.markers.MarkerStyle(marker = markers
,fillstyle='full'),#设置marker的填充
1 E, w2 B- L/ s* |
alpha=0.8, #marker透明度,范围为0-1
. N5 F5 y4 T! { f: z |# w
facecolors='r', #marker的填充颜色,当上面c参数设置了颜色,优先c
! ?4 k/ e x8 d0 c
edgecolors='none', #marker的边缘线色
% Q& z* F: S X5 X' D
linewidths=1, #marker边缘线宽度,edgecolors不设置时,该参数不起作用
2 \' J) k6 V2 Y$ U
label=iris_name
) #后面图例的名称取自label
1 v. s( N8 D! v! _- @
" S9 ^& H8 P' I2 r5 D' ^. p
plt.legend(loc='upper right')
2 p& E! `( L7 r4 U: h
5 y j3 o/ S! ^& |2 R% a7 R0 h
' a1 J7 Y! @+ _) n4 E# c# a, D
————————————————
/ ~! [1 o! D( Q- ? m# M
版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
$ g. {, a/ D* V- g
原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
( C3 V2 Z/ f j; j
' y9 P \0 d, ]7 a1 ]# O, |3 ~
) K/ X6 t( F: C) S$ ~
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5