QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6257|回复: 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
      i* l5 m; W# N$ y1 W$ h
    一行Python代码有多强,可让图形秒变「手绘风」' p5 c; F- b( ^7 M7 R
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    - R$ G  t( R8 o8 K6 _( ~5 r  J- R- `* L5 U
    * N' C% V" Z. e+ p0 ]
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。4 A* z2 W8 Y6 T' T4 |8 V; g
    " F7 F4 I4 S! w! a; g. Q5 t
    & F9 W) `: `% ]* O( K
    matplotlib.pyplot.xkcd()简介( _6 Z* K- w6 i6 R6 O( p  ~2 U
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    4 d7 a. \6 X$ q  c" G
    ; [/ ?& x, Q8 x0 ^& s# h

    3 z& K& i8 X+ L6 w! \9 }$ cmatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度: [# C0 W& O7 c) ?
                           length=100, #褶皱长度
    & O9 b( p$ [5 c& Y7 \/ b2 k                       randomness=2#褶皱的随机性
    3 w( H2 K# q# c+ C1 _4 Z, ]1 I                      )/ \+ ?' Z9 p5 X, J# W1 s* g+ f" F
    matplotlib.pyplot.xkcd()使用
    $ _" J1 E) [5 v5 E2 A如下,加with行代码即可,括号中参数按个人喜好决定是否设置~+ R/ i+ o( `* ~# G) T
    8 F2 p- {, ]1 J6 Z0 P
    ' ^: H4 E9 m: I* i' i+ P
    with plt.xkcd(scale=1, length=100, randomness=2):7 L$ ^$ |3 W2 d3 j6 |. W
    #with是临时使用一下,不影响其它图使用正常样式5 R* ]9 y) J2 K+ o3 u/ j0 K! O
        绘图代码
    + \4 t% h# D  g3 g/ I    。。。。。。" ]# p; a. Z3 N+ H' [
        plt.show(). a; N$ _' k2 s' a) X7 L# d% m. j
    matplotlib.pyplot.xkcd()使用实例 6 Y6 C; t4 \8 M. M
    下面代码为pythonic生物人公众号之前的文章代码
    - S" p* a1 w0 ~; v: j$ l0 ?* R( O" R. [! g. J2 |' }- `8 W

    6 j6 A/ L) w3 r2 O; V以下参考:Python可视化25|seaborn绘制矩阵图- l' R3 m" `+ ^
    # c$ ^. ^# x9 v4 U

    & Q# z& N3 H+ x! b! R! }#支持seaborn
    " W& X6 H2 J) e; b8 h1 b* bimport seaborn as sns) y5 ^6 W7 h( L* g% R
    iris_sns = sns.load_dataset("iris")
    ( H& f2 p! E; l, V  B5 X" qwith plt.xkcd():" ]3 N7 L; y6 R; W: {# c& s
        g = sns.pairplot($ i% C2 y! f3 B4 F. t: z4 }
            iris_sns,
    6 A, {) ^* H1 L4 t- }/ |9 Q        hue='species',  #按照三种花分类
    / D  Y. G& q/ M; J+ H1 ~! u        palette=['#dc2624', '#2b4750', '#45a0a2']). Z: M( f8 A% ^4 U9 b( ]
        sns.set(style='whitegrid')! p/ I$ W" q- r) k" v
        g.fig.set_size_inches(12, 12)
    / V0 ~7 \5 q7 {7 v    sns.set(style='whitegrid', font_scale=1.5)
    3 h, ^0 w- M9 a  
    0 t( w7 B, y3 l! ?! @- P+ u' v) O1 i3 r) G+ f! B

    2 A$ ^. E$ L& \% M$ c3 e$ n以下参考:Python可视化29|matplotlib-饼图(pie) ( r7 q' R% n: `  ?+ Z
    / X- K1 W6 X% ~! Q, R* V

    : k4 T# k" J4 H1 [import matplotlib.pyplot as plt" s0 K1 E" g: \' F3 s: [
    with plt.xkcd(- t. g/ L5 Y. H% w8 }
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度; G# g/ W8 h4 e3 b' k9 A" r
            length=120,  #褶皱长度. R! U3 J# ~" \5 R& ~
            randomness=2):  #褶皱的随机性9 @' D* e7 N: ]$ s5 A% c
        plt.figure(dpi=150)
    - f- f. m8 o3 i* J$ I    patches, texts, autotexts = plt.pie(
    / w2 K7 c. j* h+ Z" F        x=[1, 2, 3],  #返回三个对象! r  I9 [+ [7 L1 M
            labels=['A', 'B', 'C'],6 u1 P0 L8 t0 b3 T4 W  L
            colors=['#dc2624', '#2b4750', '#45a0a2'],' J: T  ]% u1 \8 M- k
            autopct='%.2f%%',
    ' O6 P; k( o" n9 n7 |/ Z        explode=(0.1, 0, 0))
    * j% t1 F! b  A, T- ~1 [    texts[1].set_size('20')  #修改B的大小
    ; u# b1 q- T, l7 A9 O* u: q
    # c- Y; M3 Z$ q/ ^9 ]1 P    #matplotlib.patches.Wedge
    9 y7 D- }  ?+ V& L3 r' e) K! E    patches[0].set_alpha(0.3)  #A组分设置透明度
    4 _" M& |8 w/ W0 C7 \    patches[2].set_hatch('|')  #C组分添加网格线
    % c9 H5 X7 y- U3 p" [2 ]    patches[1].set_hatch('x')
    ) g1 k% d0 F( i/ D. h5 V9 `
      C" e% Z; h; W& a4 F1 W9 ]    plt.legend(
    6 f! ^: a2 R+ G* v        patches,
    * @, M6 R% P+ J2 ^3 S' V4 u7 M6 {        ['A', 'B', 'C'],  #添加图例, u! H5 ~7 Z: P, X  M% p
            title="Pie Learning",
    4 H& Q7 ]( s$ ~* l        loc="center left",
    4 s0 S8 n9 C  y# i% G, b        fontsize=15,
    2 k9 \9 m6 T8 |& Y! @! {( @        bbox_to_anchor=(1, 0, 0.5, 1))
    ; _9 S; T4 Z, ^$ f$ c( w
    3 o8 W* c. Y- K/ @) ?9 [! I: B, B    plt.title('Lovely pie', size=20)
    0 x/ x2 O5 V, B: b7 J+ [. g7 X: v) V    plt.show()" C/ B+ F+ P2 _" L# u8 ]! k

    ; Y$ R1 ?$ q2 R5 ~

    " m# ?9 ~( K: ?6 V; c$ }
    ) p  ?- G% r9 ~( T. _$ Y6 _
    % a  @1 J% N& H5 r
    with plt.xkcd():
    * l/ v' ]* Z% `/ v/ ^6 F    from string import ascii_letters, H6 |# ]* \4 u6 |
        plt.figure(dpi=150)
    3 G( d$ d8 K7 _9 V& B* p    patches, texts, autotexts = plt.pie(
    7 T1 J4 ~0 L4 g4 [: E# j% l        x=range(1, 12),1 E% T; N2 M5 i2 B
            labels=list(ascii_letters[26:])[0:11],
    % t4 t4 l0 e' o4 E+ _! M: {        colors=[8 h+ R+ b1 B5 p% o/ N
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',9 W" [; T9 j& L: V! g& z/ Z
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'+ N* _0 ^  |( J1 A; Z( I+ O
            ],' M2 Y9 i' H' C, R$ \# i" S7 F
            autopct='%.2f%%',
    ! [& g; p5 I3 s% k4 y8 R7 |' H2 W6 {    )
    / v; a6 F/ B' X; d2 ?" v( X  F8 h    plt.legend(
    + [4 W+ i+ W* _        patches,& J& ?/ \0 b6 k5 M1 i0 r" W/ @5 t# F$ `
            list(ascii_letters[26:])[0:11],  #添加图例, Y! v+ q$ b$ G3 S5 L
            title="Pie Learning",+ n! X1 s& P. @' v! E1 Y) y
            loc="center left",: `* u" C. N9 e  L/ w
            bbox_to_anchor=(1, 0, 0.5, 1),
    + l0 s5 O  q* m3 q8 a+ |$ f        ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    ) n- c6 U9 u1 O! {% Q7 l6 D    )
    * p8 `0 {5 t6 |6 {# t" D& L2 @% q! B/ d+ A

    . T; ~1 W. G% E
    6 h3 E' k7 T$ h( U- d/ }0 e

    5 y+ `9 K+ w$ @& M/ Q( U6 F5 Zimport matplotlib.pyplot as plt7 C& X; u# r" j, o5 T
    import numpy as np
    - l+ m9 x6 O2 ~with plt.xkcd():
      h. H! V8 l8 f) F- q    plt.figure(dpi=150)
    1 O6 _, \1 J; V' A    labels = ['Jack', 'Rose', 'Jimmy']9 g/ [+ x) N; ?* E4 U
        year_2019 = np.arange(1, 4); w* y: V6 e; @( ~; P( E
        year_2020 = np.arange(1, 4) + 1
    + p  A2 Q% T* T    bar_width = 0.46 }1 a, ?& `6 P$ O
    * u5 Q5 z) ], G+ d
        plt.bar(: V/ b& q7 C* I% C7 B! \% O
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    + c6 ^5 a+ J, c) I0 P; @& s        year_2019,8 l! q9 C* h3 y
            color='#dc2624',
    5 t$ J0 M( k/ Q8 D9 ^        width=bar_width,
    1 g7 J% A, o' }4 t% \; Z        label='year_2019'  #图例
    * A/ W5 O4 d0 N    )" d9 o$ Z7 C" B9 f; c9 Y0 O9 R
        plt.bar(
    % G6 U) G# ~5 r  A( z# ?9 U        np.arange(len(labels)) + bar_width / 2,8 p! Z; Z; `. s$ Q: b( X& x1 ]
            year_2020,. [7 o' _! ]& B" U4 Z/ H! p, {* E
            color='#45a0a2'," i% k. x$ J$ E- U0 J1 W8 N
            width=bar_width,: Q, t3 ]% L( V& `- E, j
            label='year_2020'  #图例$ Q8 }% u4 N4 W; {/ k1 I1 d3 D
        )
    6 ~6 o0 W4 E5 G' z% h    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称. e5 P$ e9 @. R* x) }
        plt.legend(loc=2)  #图例在左边
    1 t; D2 E, \2 a4 F: O以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 - P1 Z6 v: z$ c) e
    3 F! S% f$ I, m1 s6 M  e8 O, ^

    5 M- Q9 }* I. n, }) D+ ]+ M- U- L+ k* I3 H: \2 Z. ?, s
    5 N+ \4 G$ i/ S) R) D3 p
    8 W0 C$ d( E  P* E) [

    & H; L+ C4 d; t# h. o" _以下参考: Python可视化|matplotlib10-绘制散点图scatter
    4 B- l7 o; B2 u& T. d) E: N* r* A( ~& h) Y  o- N
    # e; i* p1 N$ N4 ^2 t6 N' j
    import matplotlib.pyplot as plt9 @+ T% [4 D4 R1 p6 l' Q
    import numpy as np
    : x, `, R( |$ C- T! w7 {0 f0 _) pimport pandas as pd
    7 i0 Z! I& r% f. g/ dfrom pandas import Series, DataFrame- w4 r+ P3 k* H: \3 C
    #数据准备
    2 O8 ^8 f6 ]0 Ffrom sklearn import datasets
    2 O+ p+ v2 o7 L9 q+ ]; Z! u6 s
    ! O( a5 l" q! H/ D; miris = datasets.load_iris()* x" y4 x7 S6 f& E
    x, y = iris.data, iris.target& Y+ Y8 K4 O6 x: n+ U
    pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),0 C; U) u) s& B) S) m2 {5 L
                           columns=[  A0 }$ O  C+ e3 K
                               'sepal length(cm)', 'sepal width(cm)',. n: n6 i1 F2 \. o% w: U
                               'petal length(cm)', 'petal width(cm)', 'class'$ V2 h2 m& N+ v0 O( x
                           ])
    ; u1 U0 F6 C& ^# C* d' [with plt.xkcd():
    $ c1 m  Z# M) r, q# d " ]4 N( f! ?$ w9 e0 I5 S- J8 K
        plt.figure(dpi=150)  #设置图的分辨率& ]. F* }2 I. d7 _  B& |
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图0 o: L( j5 d4 F. e( c3 C9 g+ |2 Z
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
    ) N% X- O- A9 m9 L" F! `: o    iris_name = iris.target_names  #获取每一类的名称
    ( ^' T: ^& P; M$ z5 {    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色8 a9 f# G% U' O
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形9 t7 r4 B& A' S) M" U6 {' [' O

    7 A; h, H5 D' ]8 ?8 r" g8 L6 @4 u    for i in range(len(iris_type)):
    7 q/ p4 C0 o( Q* G! \: O        plt.scatter(
    & w1 E  b1 a% i            pd_iris.loc[pd_iris['class'] == iris_type,
    8 {9 ?$ g6 H1 j, T6 L! ]  F                        'sepal length(cm)'],  #传入数据x" s" D7 ~' U6 f2 b! ?- o5 H
                pd_iris.loc[pd_iris['class'] == iris_type,; |+ W; Z4 w- k
                            'sepal width(cm)'],  #传入数据y+ b; r' p  L" t! g: o
                s=50,  #散点图形(marker)的大小0 s% @0 q; h, k$ E2 u
                c=colors,  #marker颜色9 v/ `) A. m! F6 N3 f2 G
                marker=markers,  #marker形状7 u! k0 n5 c) V: D% V! O" d
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    6 m$ v& e" x  h/ `            alpha=0.8,  #marker透明度,范围为0-1
    # S* k6 f4 n; R& X/ h, k0 L8 l            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    * B2 o1 n# r' @            edgecolors='none',  #marker的边缘线色
    6 Z) ?0 R0 N3 ]; x            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    + J1 B3 e. I1 G6 C  w/ u  U            label=iris_name)  #后面图例的名称取自label% h/ k$ `1 Z# {) s) \

    7 q# I- ^3 x2 L& I2 A    plt.legend(loc='upper right')
    ' }$ B' a5 W. }  S1 P2 {! R6 I) g( g0 F7 L! f  `, b
    4 A2 {: }/ }( J8 n7 H
    ————————————————+ e5 c6 E- P& |( M: H
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( r" H, j( Y5 e
    原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753* Z/ e) q$ a& S4 b+ i- I0 L

    ( Y  {, z( p+ H2 q/ o3 F. W- d: N% P1 e4 p3 N& A6 p, D$ d& A7 @/ P
    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 05:03 , Processed in 0.324170 second(s), 51 queries .

    回顶部