QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6256|回复: 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

    9 ]9 k2 s, Q- L1 u# O1 B一行Python代码有多强,可让图形秒变「手绘风」
    # L7 H3 J2 k& p7 h5 k# X之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    ( e1 F! ~5 p4 n  q
    ' E! _' o, T8 ], T6 b

    - K4 f( b# A2 p3 [但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    * Z. w1 v9 x5 p: P) Y( L" W; }
    7 V5 @/ j0 h0 x3 Q4 Y+ R( K

    $ a" H/ X# P$ n  O1 ^) O' Mmatplotlib.pyplot.xkcd()简介
    $ Y& H6 ^1 H4 a. |* i这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    # b2 t6 ~. H' K- j3 D. v" l! c* D; H! m$ Y0 x/ m" }
    # }4 ?, b; b' h9 y. N8 F
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
    8 ~+ K+ W6 p4 i7 U% a# A1 u( S                       length=100, #褶皱长度
    1 j5 G, T; R7 D. z; B8 U6 C                       randomness=2#褶皱的随机性. s4 w! u0 d7 t- P, H
                          )
    * H* f" t. \/ k9 C7 Fmatplotlib.pyplot.xkcd()使用
    8 P' q% b3 b0 c如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    " Q3 J/ a2 D6 w; E+ o1 q( t" R' a; B1 s0 Z

    ! I* N, K5 }; w4 U7 B* d" h6 ]' D* m) owith plt.xkcd(scale=1, length=100, randomness=2):
    % A9 x# \6 N. k#with是临时使用一下,不影响其它图使用正常样式
    / u2 d5 d/ W) o    绘图代码. t# k/ Y2 N6 @. v1 L8 X$ o& r) r8 X
        。。。。。。! ^! }0 W) c( L1 b* e! g' x
        plt.show()
    $ Y. X- X3 C: @' F1 w7 Qmatplotlib.pyplot.xkcd()使用实例
    % ?( ^4 a% I  |) d9 I  t( p1 j下面代码为pythonic生物人公众号之前的文章代码% d' ~" H8 ?" ^7 p5 X9 {
    ) x$ p1 i5 ?: J# H$ I$ b8 M, L& U! ?
    ) h# m1 ?9 Y' k% E; a4 ?
    以下参考:Python可视化25|seaborn绘制矩阵图) S1 h: _4 H- b  I% ^) v
    , n0 r6 u, }5 O; Y' q9 S

    * C2 H# c* F" e. q1 f#支持seaborn
    : p' U6 J3 T& \# j! W$ H7 `import seaborn as sns& _4 U$ p- f3 R
    iris_sns = sns.load_dataset("iris")
    4 [0 _% s. N' N# Q  wwith plt.xkcd():; k; q  ]6 y& Q% M
        g = sns.pairplot(" t% j$ v4 i7 V. R( V' X
            iris_sns,; l9 \! [! [" o/ [$ @" f3 F; c" Y+ q
            hue='species',  #按照三种花分类
    7 e( Y& S/ b* w        palette=['#dc2624', '#2b4750', '#45a0a2'])
    . {) k/ W7 N/ ^3 A% }! F    sns.set(style='whitegrid')
    7 t$ @' z# B' l- t    g.fig.set_size_inches(12, 12)- I9 q/ Q" p) c
        sns.set(style='whitegrid', font_scale=1.5)# p" J  W3 `6 W. [! [1 n
      
    % P" P1 S5 X3 L3 A" H6 Q
      Y3 ?+ K  ~' W7 y+ O
    ! o0 e" o5 b% w/ [% X9 |
    以下参考:Python可视化29|matplotlib-饼图(pie)
    0 n2 v0 p7 d7 a. \; r; j
    ' J: F( {5 \0 s+ T* K8 y& c8 k

    . @2 i1 t% G& i% F8 timport matplotlib.pyplot as plt7 s  _) B( [, P# E' }0 `0 v
    with plt.xkcd(7 m* P7 A6 z( c2 ?# g
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度
    ' B, C) f6 g" ^1 P        length=120,  #褶皱长度
    ' W# O4 n4 u1 l  r; B        randomness=2):  #褶皱的随机性
    0 m: P' d" M! Z: z: J    plt.figure(dpi=150)
    ' @% b8 ~# U$ l    patches, texts, autotexts = plt.pie(
    0 U( Y8 ^8 s& B        x=[1, 2, 3],  #返回三个对象
    * B$ L* f. ~1 x( R  i3 @4 O        labels=['A', 'B', 'C'],
    / m0 m; ~3 E" ^8 w9 f$ J5 ~) Z        colors=['#dc2624', '#2b4750', '#45a0a2'],: y: u; j: ?+ q8 M; I: t0 n& x
            autopct='%.2f%%',5 I7 c- G  m2 N; p3 L
            explode=(0.1, 0, 0))
    3 W' f- T0 x- |1 j0 \. v2 k    texts[1].set_size('20')  #修改B的大小1 Z) p% w' d1 I, K* Z1 n
    % R; v2 c# ~9 `9 B9 S6 t  K5 c6 E) p
        #matplotlib.patches.Wedge
    ; a1 U9 m0 Y# V    patches[0].set_alpha(0.3)  #A组分设置透明度
    6 ^* T( q& ?0 o9 u! u    patches[2].set_hatch('|')  #C组分添加网格线
    7 M/ M. \( N! f6 s! v- Y    patches[1].set_hatch('x')4 M: I0 e9 `: X8 f/ R1 t/ I" I
    0 m- y* T/ c/ t( P
        plt.legend(, m3 O# i6 o+ J! s6 U6 w
            patches,
    / [3 }) K: D: C        ['A', 'B', 'C'],  #添加图例' t; p3 s+ e% K( G6 a. p
            title="Pie Learning",* D5 e" j- @1 S: v% N$ ]3 D
            loc="center left",# J8 B2 |/ n/ I3 a) D3 s4 B; g
            fontsize=15,
    ! Z& Y/ q6 F' e6 T        bbox_to_anchor=(1, 0, 0.5, 1))
    . _  `6 t5 Q8 |9 H) J1 r" R
    / N: c8 p( c2 `8 A0 x, E4 f    plt.title('Lovely pie', size=20)
    8 |7 ^3 a7 I/ A2 ]- F# A    plt.show()" {3 Y5 z- d0 x- g* b$ p
    $ J( t( p) O- O. a0 [
    & O& }  l- @+ Z& z. y

      ~# F( p4 E. F- j+ ?
    3 c: ^6 c, n  |  P3 \( ]+ Q' V1 _' E
    with plt.xkcd():
    , _# q! J! w3 X  w1 Q- C    from string import ascii_letters- ~0 ]. H; k8 @) S
        plt.figure(dpi=150)
    ! k9 R( j  Q1 E' Y7 y" f    patches, texts, autotexts = plt.pie(
    4 p3 h* u- Z3 H/ B6 G! D) y: j% v/ _        x=range(1, 12),4 H$ Z. Y% }9 V% F- L
            labels=list(ascii_letters[26:])[0:11],  `: s7 x$ @% \
            colors=[
    2 {7 T9 {* I4 D  K' c' c. V1 T            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',  L: y7 P# V2 p, `) O5 x3 t% U
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'; P& q9 u% F) b# T
            ],
    . y7 h# V+ P- A- T  ]8 ~        autopct='%.2f%%',
    6 U1 h. u  e- A    )
    ) z# b# t( a  K; n: @/ h3 B& u    plt.legend(6 q5 B! k' {: f! A! H
            patches,
    $ L: `6 i; I" [        list(ascii_letters[26:])[0:11],  #添加图例+ L* l% C# n* }* V5 N8 M9 ^1 z' c
            title="Pie Learning",
    & F- N' R5 c1 c/ @: Q3 K* u        loc="center left",4 F' o6 [- q" b4 x
            bbox_to_anchor=(1, 0, 0.5, 1),
    ( S" Z4 G" B) N/ t) m        ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    6 g: D4 a1 `6 F8 b    )5 y* h6 t1 m, m5 d  d5 _) m1 s

    : x5 J5 c& D4 S
    5 I2 L& I0 O9 I7 J1 b9 P

    ' [$ H# f. J- Z7 N
    ; A: H( {3 Y& ]: C2 M+ s
    import matplotlib.pyplot as plt
    & y' V) H9 G5 {& d- ~8 d! Kimport numpy as np* U" g$ P6 g; h& o; [  g
    with plt.xkcd():/ ^/ O0 Q1 a5 b
        plt.figure(dpi=150)
    5 C/ ?2 G/ t8 }- _8 }* [    labels = ['Jack', 'Rose', 'Jimmy']( G: W6 V) `, b, S
        year_2019 = np.arange(1, 4)
    ! W* {0 q% N' R* N) S" O/ i    year_2020 = np.arange(1, 4) + 1
    + T. f* u$ A- g' }/ Q! J    bar_width = 0.4' g5 v/ m6 \) [4 Z" N; x  p

    2 I7 o, x, }1 T$ e, i) H, L# w4 B: T5 \    plt.bar(9 q* r8 C& D# \% m- F/ h' v" W
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽3 F- M; f" l- e3 q9 d4 O" @
            year_2019,4 B- k  f/ m( I; K$ m, L; I
            color='#dc2624',: M( N( l) F* q) p2 B6 O% n
            width=bar_width,
    # t* L/ t7 Y# ~8 u) I        label='year_2019'  #图例& ^) V5 o6 l4 x
        )' n8 o. j  }% L) P6 n
        plt.bar(  m. Z9 B5 v! o* S2 S! N; ?$ e
            np.arange(len(labels)) + bar_width / 2,
    7 \& p, _/ Y% i# U( }        year_2020,
    $ ]. ~# F+ R5 \5 W, }        color='#45a0a2'," z0 E4 A+ d& L( E0 R" h, N3 L
            width=bar_width,
    $ N$ A0 v5 P3 ~( ?( C& n; u        label='year_2020'  #图例% ^2 _, t" q0 ?5 B
        )
    ; P; g2 \+ g5 n# b7 m( f- D    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称( j/ o5 V+ L. w+ _6 X3 D
        plt.legend(loc=2)  #图例在左边! g4 S; p7 E! G0 [1 m
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
      V( z* J7 ^7 F
    5 v9 R1 d/ \. O2 m
    2 T4 F6 Q2 U# P# t

    9 p) {2 _5 N1 H  U# w8 C, n+ u' B

    ; ?% c3 b9 z9 q" k2 t, ^5 \( P4 l; W9 K- P
    ( |  D7 T% K% g% [" a9 V) y
    以下参考: Python可视化|matplotlib10-绘制散点图scatter
    6 I1 @) w9 H: V% x3 j! w8 }& |" E' q) T% D$ M, ~; l- s/ d
    ( I" a$ u# }# W: X
    import matplotlib.pyplot as plt
      c" l; p; _1 W  {2 W- q! K) U* Uimport numpy as np3 ?" B# W/ ]1 |
    import pandas as pd; n8 s, @, W( Z0 X/ ^# P
    from pandas import Series, DataFrame* ?4 x+ [. F* e: N
    #数据准备
    6 v  m8 m" F3 k. X# Bfrom sklearn import datasets  Y% F6 C' P, x+ e& e

    4 S" G; k( b- F" B. S" ^iris = datasets.load_iris()
    6 Z$ o6 B- N) w" Dx, y = iris.data, iris.target
    / O& M( g/ M$ H: b4 U& s/ N" R% }pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),# e; _8 I5 G: N: V- D3 H$ u  [$ {
                           columns=[
    , y. X! s7 ]. h* N; F3 L% F                           'sepal length(cm)', 'sepal width(cm)',
    6 U# J5 X, C* G8 H; J' R1 k                           'petal length(cm)', 'petal width(cm)', 'class'4 o# y7 A! F1 B
                           ])' {# m; D/ q+ c3 x# Z6 |
    with plt.xkcd():+ w, H: u" X% q3 Z* c, f& G& S
    , ?+ c# v3 b) }8 d8 _( {8 Y
        plt.figure(dpi=150)  #设置图的分辨率
    " V; ?  z$ e* Y6 d! _0 x0 Z# s    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图) |. i% `: P  A5 u; w! R
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
    7 ~) b" c( }' O$ j; y' w    iris_name = iris.target_names  #获取每一类的名称
    : J  g0 ?. W1 P7 ~  \    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色- L/ @; v$ E5 P# a' |" w" t9 I4 r& i
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形1 g9 B0 l9 X- j+ s& Y) m

    7 z# U% r( L9 u" V% y0 z1 B- r* Y; P    for i in range(len(iris_type)):3 q2 O; k% P! V$ p) h* G, e  h6 d
            plt.scatter(& y- d1 D, F- f
                pd_iris.loc[pd_iris['class'] == iris_type,+ L4 ], O, Y' A0 `* u1 h
                            'sepal length(cm)'],  #传入数据x! T1 a9 {3 g$ u# {
                pd_iris.loc[pd_iris['class'] == iris_type,
    ! i% V/ Q+ H7 I9 b) Q* D                        'sepal width(cm)'],  #传入数据y/ V( k* T' u: L1 @4 x2 W& V. P
                s=50,  #散点图形(marker)的大小
    - W* G2 z7 w3 q7 H: Z            c=colors,  #marker颜色  \/ [+ S# U+ B2 P% H3 F5 e: Q
                marker=markers,  #marker形状
    * c: D" v3 V4 u" E, [            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    5 F* C6 p# n1 [8 k" f! N            alpha=0.8,  #marker透明度,范围为0-1/ ]( K1 B, z+ C0 L5 o8 l7 e: n8 Z
                facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    ' s4 u- X9 E! h) Y1 d            edgecolors='none',  #marker的边缘线色7 i9 s3 t3 M& h
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用; h8 ~$ \' v' M$ s
                label=iris_name)  #后面图例的名称取自label/ N0 H7 V# |0 O9 B6 _

    $ a) f: G' z  o    plt.legend(loc='upper right')  u# {! e$ q2 U2 d9 t
    # i1 ~# y$ P; F6 I7 _9 B, j

    3 u6 n, ]: B3 x' |0 b0 x————————————————- u$ c/ `1 P/ e
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ! q* H7 u" v' @原文链接:https://blog.csdn.net/qq_21478261/article/details/1189637533 i  w- t6 ]- O; y9 r* S3 ?6 P/ B

    - ~9 I: F7 x7 R$ g& k; s
    ; w/ B4 Z6 @# O+ m+ G' ~5 s
    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-7-18 02:40 , Processed in 0.501174 second(s), 50 queries .

    回顶部