数学建模社区-数学中国

标题: 一行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 mimport seaborn as sns6 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 T5 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 owith 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.Wedge3 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% qimport numpy as np2 ~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( Cimport matplotlib.pyplot as plt# K$ }$ k0 z: N' c& V
import numpy as np) [/ n1 J0 t3 l- E1 j  [
import pandas as pd2 j' s! k# ^3 `$ G6 t, N
from pandas import Series, DataFrame3 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)'],  #传入数据y6 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-15 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)  #后面图例的名称取自label5 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