数学建模社区-数学中国
标题:
一行Python代码有多强,可让图形秒变「手绘风」
[打印本页]
作者:
杨利霞
时间:
2021-7-22 11:56
标题:
一行Python代码有多强,可让图形秒变「手绘风」
' ^* g/ J0 x! ~/ ~& [5 l5 R$ M$ O3 G+ r
一行Python代码有多强,可让图形秒变「手绘风」
, Y) [' S8 j ?+ [. Q1 v! ~
之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
5 J0 u$ c/ _4 |; B( _/ c. X8 {
6 z1 y6 S, l6 s/ @0 G: ~9 ^
. _. `! Q) W/ b. S' X: ?
但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
$ C/ s1 s; p F4 S
. G. H* K5 a9 Z1 {( o5 F. s
5 ]) i0 u: @) B! O$ E) [7 K( r
matplotlib.pyplot.xkcd()简介
% V$ R9 P$ U/ N+ ]
这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
R3 r6 m0 s- Q
' f" d6 _- ~7 K2 v* J
4 K+ t* Q. T; k, `) ^
matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
8 C* l# \" N# B. |4 w
length=100, #褶皱长度
. m: U: m% t4 ?; \9 j! {
randomness=2#褶皱的随机性
& F; I) q+ I; O; U5 W; d
)
; f+ T/ H" m" b% u0 c$ U& R6 J1 d# l
matplotlib.pyplot.xkcd()使用
2 e! F. i1 B. ]6 h6 r0 v
如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
; t. k9 Q7 W1 \5 b6 }% K+ S- z/ z
! y7 Q! Q) r. o# u9 B$ Z! P* q7 v5 \/ X
4 | Z* \# Y4 G4 K( f+ g
with plt.xkcd(scale=1, length=100, randomness=2):
$ X6 x- @! }: s* [
#with是临时使用一下,不影响其它图使用正常样式
$ F3 l% e6 e3 I( c* a$ Y/ p
绘图代码
- B' n" I3 E$ g) Q) ?
。。。。。。
4 o, P$ j1 C; D9 t( g
plt.show()
0 O0 S1 i- i# I+ t" H+ ?1 _. S
matplotlib.pyplot.xkcd()使用实例
' X, T7 M8 d3 O
下面代码为pythonic生物人公众号之前的文章代码
4 V$ [4 B( @, N q$ R* W4 I0 _) a* y
\$ Y9 e6 c7 s8 K3 M0 ~- c9 ~
% j4 b' b, J7 E% V) u9 s4 ?* e( o
以下参考:Python可视化25|seaborn绘制矩阵图
. }2 G/ r" c' Z
1 s- c7 h3 F& D9 N" t+ c5 q" g8 V
# }: b: k5 P0 c4 h3 `' p
#支持seaborn
7 Y. [" c6 o4 K5 m
import seaborn as sns
6 y0 ]) e2 m" X1 F6 f% z9 r
iris_sns = sns.load_dataset("iris")
9 D% l) b. m T
with plt.xkcd():
9 I) D8 a. \ q; T3 G! |& j
g = sns.pairplot(
# g2 R. Q5 Q+ w5 W
iris_sns,
# e% g" j( E' i* L: w5 }
hue='species', #按照三种花分类
u. S2 N1 P' }0 y# H4 B+ K; {
palette=['#dc2624', '#2b4750', '#45a0a2'])
, Z1 k6 l: x1 i% `' z
sns.set(style='whitegrid')
* {) |& H/ X$ n0 e Y/ l+ |
g.fig.set_size_inches(12, 12)
3 S, d& r& ^5 _: K
sns.set(style='whitegrid', font_scale=1.5)
2 X7 n3 Q$ W6 A- m. T1 U& f( ~
3 g& T r) R" b: I
, M' S6 l: F/ w: g0 w+ t( S
* K8 g8 v. ?# ^
以下参考:Python可视化29|matplotlib-饼图(pie)
$ c& o* L1 G7 E. j3 K& n1 T
5 B+ c+ h& J8 C9 f
7 L% [ g. M" ] \% A/ K& H4 z
import matplotlib.pyplot as plt
0 h0 i( u2 @5 v1 o" o3 o
with plt.xkcd(
0 R: \% [' f( h5 v) @4 I
scale=4, #相对于不使用xkcd的风格图,褶皱的幅度
4 {- B# ~( Y/ d" F
length=120, #褶皱长度
( I8 ], u+ m0 u# Q; W
randomness=2): #褶皱的随机性
4 ^) N2 c/ D J9 ^& v
plt.figure(dpi=150)
% O c4 A/ W! G- }( N
patches, texts, autotexts = plt.pie(
! ~) {1 N" E/ R8 O0 _
x=[1, 2, 3], #返回三个对象
N! @6 Q" V( j4 d6 L6 T5 y
labels=['A', 'B', 'C'],
6 b' `- n2 ?4 B
colors=['#dc2624', '#2b4750', '#45a0a2'],
5 P5 M0 M2 ]- }
autopct='%.2f%%',
4 `& q! S$ n/ h$ S/ n# u
explode=(0.1, 0, 0))
: O l7 ~6 U! W: R7 ~
texts[1].set_size('20') #修改B的大小
% ^0 m7 G6 @2 g/ A9 x/ W
9 A( G* X2 s- D! w; {
#matplotlib.patches.Wedge
3 M; T' q1 F% ~
patches[0].set_alpha(0.3) #A组分设置透明度
$ K) r0 G, b3 m2 {+ w; K! a) w+ i+ A
patches[2].set_hatch('|') #C组分添加网格线
- X: N% L( Y. R6 ~9 P
patches[1].set_hatch('x')
1 b" {0 t- f, H c" b; ]. O
" R. M3 I: I7 [; v2 }
plt.legend(
, F0 v, r3 |' U6 z
patches,
0 V3 P) I+ R0 A8 q U2 r
['A', 'B', 'C'], #添加图例
. ]. L5 @5 I) W; A4 d; i1 U
title="Pie Learning",
+ Y) G6 q( i4 t7 i" q
loc="center left",
7 |& K8 \) B+ e
fontsize=15,
: p/ m! x! S c6 P6 i# S+ f
bbox_to_anchor=(1, 0, 0.5, 1))
2 ?- ~3 W; Y0 ~" \6 L' \
4 _# Q5 X- g" n3 v. I; B9 F! m& l
plt.title('Lovely pie', size=20)
, m& e J: C/ l
plt.show()
T% G+ h/ j2 f1 N
* U6 l( x) ^% s) t# f+ S. z; `7 @
3 |; r( r9 E8 |3 x* z
% ^6 t% _5 g- ` B
9 u: X4 J: ~: F# [
with plt.xkcd():
; _ i6 D' g+ q. @! B7 C9 z
from string import ascii_letters
& F: e/ t5 o2 B; `- t
plt.figure(dpi=150)
) c$ j1 q$ f- X
patches, texts, autotexts = plt.pie(
3 @% Q) n" m( s* [+ r' y4 t
x=range(1, 12),
0 }( G/ H$ }7 V
labels=list(ascii_letters[26:])[0:11],
% a6 [$ r$ `, Z& ]3 S% c
colors=[
) f$ x2 N2 h5 Z- y5 |$ a
'#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
$ g/ A; S) u9 Q ^1 t
'#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
) d0 W, \# k2 u- K
],
]* _8 I: q' u# S
autopct='%.2f%%',
: F) T& G# x+ z% Q& q! v
)
$ c& ]6 A3 e3 l" d
plt.legend(
5 L- \& m& X9 b6 i
patches,
" m6 v- h% c5 q
list(ascii_letters[26:])[0:11], #添加图例
& ?2 q4 y1 w! x2 i; d* k
title="Pie Learning",
$ h$ D, w2 z6 V$ K; |/ H
loc="center left",
- s- k/ ~/ e* q8 }6 R V) B
bbox_to_anchor=(1, 0, 0.5, 1),
' W- |2 u1 Y/ d8 \
ncol=2, #控制图例中按照两列显示,默认为一列显示,
* v8 e! D! y) \; q
)
: T7 Z$ f- I9 G' ^+ s }9 x
" D6 n7 z2 H! I8 ]9 g' M; O6 a
! U6 H; I( E V8 L
) s7 T5 E. v/ ]' ~5 P% b
4 h- J: t7 D6 r' T3 M
import matplotlib.pyplot as plt
5 } h: r; a" U; t4 F% q
import numpy as np
2 ~9 V1 R/ a& A! W* C
with plt.xkcd():
( X% u. W+ x! M% C: r' i' W
plt.figure(dpi=150)
9 v! G7 z/ A( a7 d8 G+ b
labels = ['Jack', 'Rose', 'Jimmy']
5 u( a6 h, G" C1 ^& [& A9 d
year_2019 = np.arange(1, 4)
0 x5 }3 g O' R+ `
year_2020 = np.arange(1, 4) + 1
( ]& G" l7 t. T1 G9 _8 `) v
bar_width = 0.4
" J/ X# ?) U6 ?& D
. U; l; e0 w6 D' \2 ?; R7 T
plt.bar(
- C/ c7 R% ^7 [1 |6 i/ r+ v8 ?
np.arange(len(labels)) - bar_width / 2, #为了两个柱子一样宽
/ x9 f2 N$ K9 E
year_2019,
N Z4 V) B4 P* J! r, f
color='#dc2624',
9 u* Y5 R2 E1 @
width=bar_width,
& v, \# g1 K# P7 S
label='year_2019' #图例
: b9 O6 p8 h6 ]9 m$ e
)
+ H |( e. F! ]
plt.bar(
) j& G4 C0 t- u+ P( E9 Q0 u5 x9 q
np.arange(len(labels)) + bar_width / 2,
4 P( F% f; P- d' Z, ?- J3 l; O
year_2020,
* _; A* }1 f! C; N9 K; C
color='#45a0a2',
, v" @* ~7 [ g4 @
width=bar_width,
9 R) I% `2 r4 P, |- C
label='year_2020' #图例
0 U/ P3 o6 H5 S N& g
)
( d( H6 t8 J9 T# S% Z0 Z
plt.xticks(np.arange(0, 3, step=1), labels, rotation=45) #定义柱子名称
^# T5 k9 M, J
plt.legend(loc=2) #图例在左边
4 C, e; Z) R, u a/ d
以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
" U# b6 \% @$ P9 H# t3 D5 }! |
" Z2 `7 h! X k- {) n/ n
3 X% m) Z- w, h: ]1 |5 i
~1 R3 I& S5 e3 K8 D* L
* o7 }# c" |5 ?% _& _) `: R& }
& w' l' I6 J+ R
* D6 F/ j1 v6 I9 X" v% f
以下参考: Python可视化|matplotlib10-绘制散点图scatter
/ w! e t* i# i# Z" h! ?
+ c) ^- Y/ c- @- t- k
* H8 X {* P( C
import matplotlib.pyplot as plt
# K$ }$ k0 z: N' c& V
import numpy as np
) [/ n1 J0 t3 l- E1 j [
import pandas as pd
2 j' s! k# ^3 `$ G6 t, N
from pandas import Series, DataFrame
3 N! @4 q/ h3 |! A
#数据准备
; U5 F" K) ?5 |( g. D! w' j
from sklearn import datasets
% j7 G, Z/ U. C, I, i: U
" U5 q7 m1 E$ I+ J8 N& v
iris = datasets.load_iris()
c3 r" ]0 a1 S8 k( Z/ S
x, y = iris.data, iris.target
/ S; S. n9 Q, t, u9 _) I
pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
! w) ^* e0 D/ Z+ K% i0 e
columns=[
; @, g1 k' l) h
'sepal length(cm)', 'sepal width(cm)',
+ M, r+ G; D$ [0 _
'petal length(cm)', 'petal width(cm)', 'class'
( O+ j0 t, J4 ?* t' p* z2 \
])
9 k q8 q( c& l
with plt.xkcd():
) z0 L& y$ h7 V1 U8 B8 D8 M
- ` J$ b! u1 E
plt.figure(dpi=150) #设置图的分辨率
5 S" k# Q' V. L( l/ {0 |) I. n
#plt.style.use('Solarize_Light2') #使用Solarize_Light2风格绘图
( h# [; U* ]" i) o) Q6 [ u
iris_type = pd_iris['class'].unique() #根据class列将点分为三类
, r" y9 @) R) U1 j3 B
iris_name = iris.target_names #获取每一类的名称
1 X+ q8 ?# J% `8 h* A
colors = ['#dc2624', '#2b4750', '#45a0a2'] #三种不同颜色
; V. L4 l8 }9 z) v
markers = ['$\clubsuit$', '.', '+'] #三种不同图形
1 X% b& a5 c( |# h, a
1 o ^3 T& c: n% {( t0 b/ E6 I! e
for i in range(len(iris_type)):
" N6 }( @8 c# R: i1 {4 U) ~# n% ? @
plt.scatter(
) N3 x: I8 \9 R! C0 d
pd_iris.loc[pd_iris['class'] == iris_type
,
! ]5 q7 c3 i/ |8 |
'sepal length(cm)'], #传入数据x
+ u3 K5 F5 X, G6 _% b u6 N8 S' n2 o6 A
pd_iris.loc[pd_iris['class'] == iris_type
,
# D; {+ u: A9 q: E+ O. Z
'sepal width(cm)'], #传入数据y
6 j, ~% d$ r3 v4 P
s=50, #散点图形(marker)的大小
8 w( o1 O# i$ E* K- q* I
c=colors
, #marker颜色
& M2 Z# h, v# C! _5 \ ]& E
marker=markers
, #marker形状
3 D, c* S! h) G5 b+ x# Q
#marker=matplotlib.markers.MarkerStyle(marker = markers
,fillstyle='full'),#设置marker的填充
( u5 _% g& S$ u, ~
alpha=0.8, #marker透明度,范围为0-1
5 N: U$ v; ?) x/ X! q
facecolors='r', #marker的填充颜色,当上面c参数设置了颜色,优先c
. T$ F% c# Q1 V2 V
edgecolors='none', #marker的边缘线色
: g6 z- s0 R$ j F
linewidths=1, #marker边缘线宽度,edgecolors不设置时,该参数不起作用
6 `% @% ~/ R& n3 [, v0 N
label=iris_name
) #后面图例的名称取自label
5 y- b I; Z' o' I6 z7 y" P' G
7 v* x- y5 ^9 Y. F
plt.legend(loc='upper right')
2 ` ^& I5 y2 I
) _( x8 Z( {/ E* U6 s0 F
# r: [; }" t2 Y3 W
————————————————
* R7 v2 j( y, [, J9 k
版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: |& Z; ]" K! B
原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
- x; m! X. R" \6 a. ~+ a
) `0 I8 N. M$ l o4 ?% {
, Y2 ^$ h7 ?& {8 I
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5