QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6289|回复: 0
打印 上一主题 下一主题

一行Python代码有多强,可让图形秒变「手绘风」

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-7-22 11:56 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta

    1 i3 T( t! r- p4 |一行Python代码有多强,可让图形秒变「手绘风」
    % Y$ A1 a7 x. a9 y5 P之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    4 |+ C" S4 M0 y! B0 J  y# O$ k
    " P1 v! \1 A& }4 e+ l& G
    & P/ q* z! L2 ^, C* _1 }
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。* p( c4 y' {; c
    6 e- }) q: ~, f  e3 y  Z9 E% V8 T

    $ \! J6 @6 c. ^  Umatplotlib.pyplot.xkcd()简介
    - ~( {& f1 t; q1 u' m* ?- B. _- {这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    4 x* [4 z/ e4 p/ G* Z
    & j; C" p* Y' f- i* Y; `

    $ F% @& \2 ^: B! u& \$ hmatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度4 ?# Z% Q* D: h
                           length=100, #褶皱长度0 }, a  Y( `" R
                           randomness=2#褶皱的随机性
    8 s& n  b5 H- E7 U2 i$ |                      )$ ]$ V/ u+ }$ E- B  c; K* n
    matplotlib.pyplot.xkcd()使用+ |, N4 F, M; o! }0 X
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    " k" L* E$ _7 ]+ T/ k, W" ]0 I" O* ~0 d2 T* x2 @2 S7 p

    7 P9 n: L. v) c4 bwith plt.xkcd(scale=1, length=100, randomness=2):
    # v; \% Z1 ?* M7 O! G" |- V#with是临时使用一下,不影响其它图使用正常样式3 t$ v2 S2 y( r- w, g
        绘图代码( Y7 |. t8 Y$ \! L  G! s$ a) r
        。。。。。。( j6 h% _2 G2 r
        plt.show()  m' M* s& m1 V/ Y
    matplotlib.pyplot.xkcd()使用实例
    " |5 M7 Q2 u! c. z下面代码为pythonic生物人公众号之前的文章代码, Z1 I+ ], M+ V/ G- j

    7 P5 z$ O* ^7 b& @" l
    ; j' b- F  ]5 N) H. _, n
    以下参考:Python可视化25|seaborn绘制矩阵图
    " J8 X$ a! l% X! m* x
    & }9 [4 g7 P7 r- h% m

    ' Y3 i: e- s! S4 o5 p& b  D#支持seaborn
    # c+ |7 {$ K9 U; {6 P) wimport seaborn as sns: H  w4 [) p  z/ _/ F  a
    iris_sns = sns.load_dataset("iris")# L/ h8 z& `0 M
    with plt.xkcd():  c, [: g  _  y* Y2 \" n
        g = sns.pairplot(- @4 V" L7 K7 I8 c
            iris_sns,
    5 L5 C" w& I  c* w/ c        hue='species',  #按照三种花分类' H( Q7 l/ y( }
            palette=['#dc2624', '#2b4750', '#45a0a2'])9 S. N6 e3 \- o, \4 }
        sns.set(style='whitegrid'): J& W$ F* K% r/ r
        g.fig.set_size_inches(12, 12)
    5 @& ~1 [4 H9 A- C    sns.set(style='whitegrid', font_scale=1.5). x& n  Q' ^: x, }% G+ L
      
    2 w6 B/ i4 B& r7 h; F
    7 x- B! o$ [. q" X
    * v: Q* Y/ c$ d% o( ?
    以下参考:Python可视化29|matplotlib-饼图(pie) + Y$ H" `  ?- s  d* u
      I$ v2 j/ E6 V- u* ~+ }% l
    : w$ {7 U3 E3 N
    import matplotlib.pyplot as plt
    ) P% Z4 r) k  E. o4 Bwith plt.xkcd(3 v. J2 i! D4 ~
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度! S) {- x! M+ \3 G! p; T
            length=120,  #褶皱长度
    * L& K9 |: O5 U1 I$ u8 V% K        randomness=2):  #褶皱的随机性- J3 Y  N7 K6 n$ }2 q& o
        plt.figure(dpi=150)
    4 r; C# x3 I7 ~1 E  f    patches, texts, autotexts = plt.pie(( p' k! O! L' D: j4 q
            x=[1, 2, 3],  #返回三个对象
    : D) W4 Y4 B! R  R        labels=['A', 'B', 'C'],) E% H* d4 g1 S. Z  b9 p6 ]
            colors=['#dc2624', '#2b4750', '#45a0a2'],* n1 J) L: c, b, l
            autopct='%.2f%%',
    3 J; {) Q7 U1 {0 a        explode=(0.1, 0, 0))
    $ U# l* }& c" z" j0 v6 y    texts[1].set_size('20')  #修改B的大小. R9 J: _# ~# v5 R6 o" C

    7 ~# P# L! u5 V    #matplotlib.patches.Wedge
    ( S0 H8 ]: V7 b  o' z/ I    patches[0].set_alpha(0.3)  #A组分设置透明度! }7 M; k1 Q. c0 d$ _. X/ l
        patches[2].set_hatch('|')  #C组分添加网格线
    * W$ l/ o! Y, C* r; Z5 ~    patches[1].set_hatch('x')5 n3 O) @6 b& r2 n. ~3 t4 c

    ( e, ~; H: b* r    plt.legend(& L1 a% J( B% ~( ~/ ?
            patches,. {' d% \6 F, b( t4 U
            ['A', 'B', 'C'],  #添加图例1 g  _4 a/ Z9 Z$ I% f! O: G
            title="Pie Learning",
    0 d& J, K! N6 O: `. W        loc="center left",/ N7 i/ t* M* f: W* g( V) d( _
            fontsize=15,
    1 w1 _6 b- i$ p. V, u        bbox_to_anchor=(1, 0, 0.5, 1))
    . ~& g; U: `4 q# V3 t $ o! O: |4 p1 {& ^2 m
        plt.title('Lovely pie', size=20)( o: A" k" E, ]5 X5 L- Z
        plt.show()$ S) J! o* Z" X
    / W, x# n5 U6 F/ w3 j6 m. Q4 y& ?

    ) z5 Y, u- K( P8 [: _7 U
    + \4 D- W0 o* k0 k1 m$ e' J3 H

    7 I' J( G) i- _5 M# T7 r  i  Wwith plt.xkcd():3 y' u" B& ]# n; e- h9 \
        from string import ascii_letters
    / g$ _$ U2 l  Z( t4 m+ D( n    plt.figure(dpi=150)# F5 B+ J9 S& S# J/ i, M# D
        patches, texts, autotexts = plt.pie(
    5 ^8 I5 a  w# t: I$ A3 B        x=range(1, 12),, O6 Q, N2 z0 a' y2 b
            labels=list(ascii_letters[26:])[0:11],
    1 `% v- t3 z5 X        colors=[
    / {' S6 w" j( B' s: t1 u8 |            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',: m- x/ X- _- e& D
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    * D. F; D( w0 W* _        ],
    & F# `/ E9 L# K* Z& y( @3 F        autopct='%.2f%%',; r- ]4 \. ^, O4 B+ V, x
        )3 x' t$ Y" r& E" E3 U4 ^1 O! p
        plt.legend(
    2 ~' r. p% |/ @* \4 L( ?6 U7 U# s        patches,
      n3 Z4 N7 W2 [' m        list(ascii_letters[26:])[0:11],  #添加图例7 Z. H( c& N8 P: m/ E4 w
            title="Pie Learning",
    ; A, d4 c9 v; T5 l1 c+ t2 _( K+ @        loc="center left",: y  k9 L. B) R8 T* b* L
            bbox_to_anchor=(1, 0, 0.5, 1),
    , N7 {2 C9 w; W' C        ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    3 J2 T9 V& z8 d' p    )/ L* [! c: V. h* `0 S4 {& P% b% {

    , I" R$ P( x! A/ X. X! D
    9 p, b2 [- f  W' W

    ; D9 ~9 s3 e% ~" }% h: T+ N

    4 |5 u. n- {  m% R# M2 c+ Simport matplotlib.pyplot as plt/ i  i' P# E9 `6 }& P" Y& a* c
    import numpy as np
    6 l1 K5 Q7 f/ gwith plt.xkcd():
    , D3 M5 O5 e+ \5 i    plt.figure(dpi=150)
    8 d* O$ E- R* K8 M7 Q    labels = ['Jack', 'Rose', 'Jimmy']: E% Z+ a8 E, P# u" ~  U$ L. }, M
        year_2019 = np.arange(1, 4)- _9 {+ E: r3 t* @, `
        year_2020 = np.arange(1, 4) + 1
    " H6 y  h! s" S' x/ ~/ `$ u    bar_width = 0.4
    ; H/ u! j1 {  {% k5 x/ U& p 9 Y, o1 j* h! Z; w- Q; f
        plt.bar(6 ~  ?' u# B9 g! x7 f9 ]* f& c
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    0 _& {. W) _( `1 E4 @: P        year_2019,
    ( |3 f  S% j+ C6 i( V5 s* J        color='#dc2624',
    + l9 y6 K, g4 _5 z        width=bar_width,8 @( q8 e) _6 s0 W1 Y
            label='year_2019'  #图例8 l" F- V/ I" P7 v
        )7 S3 j4 R, c8 N
        plt.bar(# j3 i8 }& i8 j7 h5 w6 R/ \
            np.arange(len(labels)) + bar_width / 2," y" i+ X$ o* S1 D
            year_2020,2 d' N3 S6 P6 |1 \
            color='#45a0a2',
    1 q7 i) i: P3 O! W8 G3 S        width=bar_width,: l  K  ]2 Z9 I- s8 Y
            label='year_2020'  #图例
    " B; v5 w8 x) |4 F9 _    ), [; m7 ]6 m; O7 |& x. u' _; d
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称
    2 B: ^* o0 A2 A! P. R" ^    plt.legend(loc=2)  #图例在左边+ F) l  S) [0 s1 t4 s/ z
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 ) c* x- l1 b8 V: q

    ) i1 T( B/ `# A

    6 E3 H, Q; ]7 L# {' g' d9 V" M' a$ |$ A- y% C- I6 n( d

    ; k* A% F& X3 }3 l+ n" s  Q+ O( M" `3 S9 |

      [% r9 I# r8 w, K& O( a以下参考: Python可视化|matplotlib10-绘制散点图scatter& _4 f9 {8 I0 l  y+ o/ F+ X0 [

    1 v3 E& M7 A, d/ B: i" B& J
    / U% _2 j0 D6 o+ ^, B. |
    import matplotlib.pyplot as plt) U; c' b& F# ^# L4 }
    import numpy as np( L6 q; x; X+ i8 }! L
    import pandas as pd" E# z6 p2 j1 r
    from pandas import Series, DataFrame
    : Z/ H; l8 k9 E2 W& _7 K& y4 r' p#数据准备, l8 r& B' P# I5 A6 P
    from sklearn import datasets) `/ h& Z' M5 _% M3 @2 t, @

    1 H4 d( ~3 Y$ l9 k$ A* o2 ziris = datasets.load_iris()
    * h8 W5 K1 d8 k; px, y = iris.data, iris.target
      [1 `& y( u' F* E7 @2 Rpd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),- `) ~) H$ h5 R1 t; W
                           columns=[! |% g- X# x9 C! A
                               'sepal length(cm)', 'sepal width(cm)',
    7 v% s& f8 n+ ^                           'petal length(cm)', 'petal width(cm)', 'class'
    ! x! e2 J, Y3 B( u5 m4 G- m9 k                       ])
    & N# a6 P  \# h) Jwith plt.xkcd():$ N% M3 d1 d4 ~4 H; u9 I

    : W* V  x1 F0 g# A+ q0 Y1 o7 w    plt.figure(dpi=150)  #设置图的分辨率! h; a) R; r3 r, \# X7 D
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图; x) N6 x( Z7 k$ W
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
    4 c6 O& E5 t- ~( r" D  N. [    iris_name = iris.target_names  #获取每一类的名称$ B8 J2 _' O+ s* e: w! ^& M7 L, x
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
    + o0 g! r& z2 T: N6 r0 g    markers = ['$\clubsuit$', '.', '+']  #三种不同图形6 h1 _7 l# q. K
      J$ v/ y) q4 j7 X: r8 {
        for i in range(len(iris_type)):( k8 T$ R7 G& }+ I5 o
            plt.scatter(7 @  i  l; ~5 h: ]2 }# g4 O0 o
                pd_iris.loc[pd_iris['class'] == iris_type,
    . Y. ~  R9 v: _; V                        'sepal length(cm)'],  #传入数据x. A9 A" z: k8 t! D5 P7 N
                pd_iris.loc[pd_iris['class'] == iris_type,
    # U! x) p' y3 P, `( w' M                        'sepal width(cm)'],  #传入数据y  q+ v- z! Y! N0 @, s) j) o5 q
                s=50,  #散点图形(marker)的大小
    * i- x2 ]3 `( G$ J+ e            c=colors,  #marker颜色; T, q. Q  {" k: K8 A( _
                marker=markers,  #marker形状! p& e$ i' U% N2 P8 B
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充% z1 B6 w0 m; C2 J
                alpha=0.8,  #marker透明度,范围为0-19 S( q' _$ A& S* n# l) w0 ?2 `
                facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c. T! z/ j) b- x" y* S
                edgecolors='none',  #marker的边缘线色" R  w+ y& D# Q( X. ^9 P
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用4 T- l" Q. j# u, Y. l1 ^
                label=iris_name)  #后面图例的名称取自label. W1 y/ X- b% F2 p' r2 ]0 V

    " P( B" I$ m- o5 y( P" T& ?" w    plt.legend(loc='upper right')
    ; J5 n. k" Q% r/ D9 x% K2 c, W" H! N3 a% |6 W# c
    + I: f0 y( k+ ~" A" b+ E+ }% o
    ————————————————
    % h7 v. ?9 x6 T" W, d版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    % H. J3 b! G* M+ f) A2 v  G4 m! i原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
    7 Q* r  N' H- \" @. S2 Y; x7 j# m+ v3 L; }  u3 X8 J/ K5 P/ {. C
    - K% z3 l7 j9 _7 U& \" R& x5 Y
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-9-2 06:49 , Processed in 0.392979 second(s), 51 queries .

    回顶部