QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6243|回复: 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
      _% ], t9 @. ~2 O( n1 }$ h2 t- V! E
    一行Python代码有多强,可让图形秒变「手绘风」
    , v$ z; _8 H" X2 Y之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    8 V: X( W" Q! g9 \1 l) A7 v( G* r- {# Q" N" [' B8 t+ R- }
    & e' P0 E5 }- O- L
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。/ Z! d! [) r% D5 l

    " _7 a* i  o, _) u
    5 f* b0 L' S' s. d, l- q% Q( m1 \2 x
    matplotlib.pyplot.xkcd()简介, A" v" ?  ~9 U2 o! q* k, X3 O
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小: b) k: j% t8 a
    " o: O8 u- s5 U. q- z( @

    * U( s* h" y: t4 h) a; kmatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
    # Y5 Z% [7 o* B. H+ n3 Q# T& {# }                       length=100, #褶皱长度1 A1 g; y) M! I1 ?  y
                           randomness=2#褶皱的随机性4 U7 m3 F* z. B5 [( U/ N! U
                          )$ E4 L7 n# p' ]1 U* V
    matplotlib.pyplot.xkcd()使用
    1 \0 q" R" q! q如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    & B4 L7 ?1 [$ \& m4 [! `+ @9 ]' ~% J2 ?8 k/ @

    4 U9 \* a3 q8 P! L$ [! Nwith plt.xkcd(scale=1, length=100, randomness=2):
    3 @" U) w: _' i: m3 s! }#with是临时使用一下,不影响其它图使用正常样式( z/ @* l8 }) ^& A) y
        绘图代码
    9 d* {# |, `- r% d0 X6 _" H    。。。。。。
    % `' X: @1 M# z, J" ?* r0 h3 b* y    plt.show()
    & v2 r+ z$ |  G) imatplotlib.pyplot.xkcd()使用实例 1 x8 k) s2 Q0 C1 ]
    下面代码为pythonic生物人公众号之前的文章代码
    9 n4 _3 f+ w! D5 M4 q+ W
    + n+ {8 ~0 F8 O# C" i0 |
    - P4 Q* A4 r2 I9 l0 u5 X5 Y# t2 K
    以下参考:Python可视化25|seaborn绘制矩阵图7 g; Z. p1 N( k' t5 r" k  ?8 q3 C

    1 V3 v( l0 L) H+ j0 h& |; F

    ! T; @" x5 [2 H( U. l9 I( i#支持seaborn$ J4 S% m  R( l3 j8 k1 t- [; p
    import seaborn as sns
    + l) d7 u( Y+ g: Ziris_sns = sns.load_dataset("iris")* H) h9 A5 }( s% c1 N: |( U( |
    with plt.xkcd():5 W' l6 x8 [& V7 f. [) f
        g = sns.pairplot(( [* Z* t6 F3 v1 D6 @! }: t4 a
            iris_sns,. |0 G* D3 c$ s& I! y3 x# X
            hue='species',  #按照三种花分类5 c2 w7 h9 S, U# w% E# v6 o% Q  B7 |
            palette=['#dc2624', '#2b4750', '#45a0a2'])7 X. K! U3 k) j
        sns.set(style='whitegrid')
    ' q( |- r$ d9 `$ Y( X    g.fig.set_size_inches(12, 12)
    , [: N% _5 N% G    sns.set(style='whitegrid', font_scale=1.5)
    1 N0 C$ s; \8 |$ D# h; O. k  
    3 x: w# a  C/ F! c" [3 v. ]8 B% b8 u! o; v

    3 ^8 `6 Q4 Z; A  O: b6 {以下参考:Python可视化29|matplotlib-饼图(pie)
    - v$ [; o$ ^+ F7 d
      ?" q( ~5 j6 S

    . w; t7 o0 w3 Y- M4 G0 mimport matplotlib.pyplot as plt6 y# ~- R& m+ B  G& [
    with plt.xkcd(# }& J# |; V: A0 D5 @. J
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度: K7 z+ C$ J! [* o
            length=120,  #褶皱长度
    4 s; _' d/ Q7 U0 P        randomness=2):  #褶皱的随机性
    1 U! X% C! w( U& c% i# E    plt.figure(dpi=150)
    - a* P% w/ {9 _8 }9 w# `' _( P    patches, texts, autotexts = plt.pie(
    $ n$ q9 _- x0 P6 N/ ]        x=[1, 2, 3],  #返回三个对象% k8 k1 G# [4 |- R$ ?6 A" y
            labels=['A', 'B', 'C'],& L4 i. x2 @8 K8 j
            colors=['#dc2624', '#2b4750', '#45a0a2'],
    $ ^1 r1 n9 I) y# V  P        autopct='%.2f%%',
    7 k" U. \9 q) a) F2 a        explode=(0.1, 0, 0))( o$ J" U8 y" N5 q% J
        texts[1].set_size('20')  #修改B的大小
    - k( r' ^2 L$ U% S( T1 k
    5 Q8 Y2 ?# S% \6 ~. l/ t    #matplotlib.patches.Wedge% h0 H% T4 ]* u4 h/ c3 u
        patches[0].set_alpha(0.3)  #A组分设置透明度# u4 f; w4 |- c' L9 V
        patches[2].set_hatch('|')  #C组分添加网格线
    3 U% g! D6 X" o8 @9 c* @; C    patches[1].set_hatch('x')* r# _, g9 T. d9 W7 c" J; l$ R$ x" e+ p

    - q7 J4 k6 \6 D2 ?    plt.legend(% H$ N* u+ U' \- j" F) T$ d5 ]
            patches,* P) x' R5 N; J& x
            ['A', 'B', 'C'],  #添加图例3 Y& b% L5 {' n0 n" M! g
            title="Pie Learning",
    5 ]! L7 v1 o/ ?% f+ z6 i& t! p# v        loc="center left",1 b' o1 q  Z" |4 z9 d
            fontsize=15,
    & a# F; j/ ]" D7 _  G7 ~        bbox_to_anchor=(1, 0, 0.5, 1))
    / X: U( E4 X) n) \% O5 _% M/ a6 y8 u - O4 r. X/ ?  B* W; Q' b' U
        plt.title('Lovely pie', size=20)
    * Z; t( a2 I, F5 i) s    plt.show()
    # ~7 ?5 M2 S" |$ x
    % U0 T# e/ `; \* Z$ f

    . U$ e8 K- q5 M( U4 _; _0 I6 r$ d6 v" @* y

    * }+ q; l" T- p& z$ Iwith plt.xkcd():5 q+ H- J" @5 T. a* P# e& e% [
        from string import ascii_letters
    ( O& p5 i5 G+ C    plt.figure(dpi=150)
    9 I' k& ~3 u" `8 c# B    patches, texts, autotexts = plt.pie(
    # ]! z+ ~( x* c. o: Y+ y        x=range(1, 12),
    . ^8 ?: j$ g. @! U1 |7 N+ v6 E        labels=list(ascii_letters[26:])[0:11],
    * u) ^" A1 d. i. N+ T        colors=[9 R2 \8 D( D0 W& g2 s
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
    1 n$ q/ c& m% f- ]            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    ' z8 c* C) x6 }8 ]5 F4 i        ],
    # \' e! Q! k$ ?* E/ J; f        autopct='%.2f%%',
    ) ^, k0 w! l$ n2 D    )9 h" s  j- r2 w7 G! q+ y
        plt.legend(
    $ ?0 @& {; {: [        patches,( r0 e. u; Q0 L, j
            list(ascii_letters[26:])[0:11],  #添加图例
    $ V. }  K+ _9 m1 S; A        title="Pie Learning",2 `3 [% r9 |! ~
            loc="center left",8 v7 N1 u! F: k% |
            bbox_to_anchor=(1, 0, 0.5, 1),
    ) @, u. s3 X. s) j4 ~6 O; x' ^        ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    $ I. I. ?: N  j1 i( K9 m    )# U" ~: E4 I9 B* G# l( N5 Y, s
    8 {; U+ P7 W7 X5 j8 h& r' t& z

    9 X3 A6 b- a/ e% g/ k$ m0 x; Z
    0 j! R  N) p' C
    & S# L/ {: C5 R# B
    import matplotlib.pyplot as plt2 N, T* q1 i8 H: w
    import numpy as np
      A2 H% r1 p* gwith plt.xkcd():8 T- [- D4 T+ t$ c# O) p' I
        plt.figure(dpi=150)
    9 L0 a9 ]5 e( s. s/ P: y    labels = ['Jack', 'Rose', 'Jimmy']: i! w2 W- A' }5 T& P' N2 R
        year_2019 = np.arange(1, 4)0 Q1 I9 g# r2 \8 h0 b
        year_2020 = np.arange(1, 4) + 1
    9 h$ M- b% f! w. w$ u    bar_width = 0.4
    , k5 {' ^! Z0 Z 0 Z* n, o4 z) P: O$ z( e1 ?
        plt.bar(
    1 W. K- Q% B" q& m% P9 F, [( L        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    ' p( J( W  _8 @% v4 V        year_2019,2 ?$ e) e- Q) f, W; n9 i' M: [
            color='#dc2624',
    + n  E7 A' n0 G% {5 F        width=bar_width,; x1 X1 N' c' m3 m' |" i) W1 j
            label='year_2019'  #图例
    $ @1 F% ~% U0 w    )8 f' l% L+ ~& j2 n: A& s
        plt.bar($ e6 I0 [4 w  W+ y8 B. R
            np.arange(len(labels)) + bar_width / 2,
    9 b! v6 j- g: m4 Q. ]        year_2020,
    4 @+ T% K' \2 |* I7 w3 q+ H+ s1 T/ z        color='#45a0a2',
    8 s9 w- l4 |" }; o  n6 `. I        width=bar_width,
    7 D! @7 o" {8 v! R# G  S        label='year_2020'  #图例9 M3 Z6 l$ K$ v( C1 f8 R
        )
    ; h3 j: S' C% B0 W0 e( Y/ _    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称7 X# O: W9 K# J2 n  y" Q
        plt.legend(loc=2)  #图例在左边: L9 b( ?# {. }
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 ( w3 C' j; l, d) @

    * n1 \& Z- Q4 ?* y- Q
    1 e5 S* H" _' R3 t" o) m8 V5 M
    ) J. w/ I* l  |: {

    " ]' k0 K, b! _+ l. P0 I4 S: N5 ]5 l3 g+ ?, J1 g5 b& `- w- N) ]7 k0 N
    ( B/ ^8 K0 Q/ t) G) r" m) Z
    以下参考: Python可视化|matplotlib10-绘制散点图scatter, U9 r4 ~. A+ C- M3 P
    # m" b- G. P! h4 n
    ) B4 q* d! Y+ }9 i" d5 b
    import matplotlib.pyplot as plt
    " n7 {% D+ ]  G9 F* W' Zimport numpy as np
    / Q& O- k+ r. Q! _8 Y% k! [import pandas as pd3 k" d, ^6 I8 ~) H- I$ ?$ Y
    from pandas import Series, DataFrame! @  Y- u7 U! y, J( S
    #数据准备, D! j) P. D( @6 [, \8 T4 z
    from sklearn import datasets
    $ |4 j) |% W+ ~  K9 J& t
    4 h. Y) Q$ L$ d8 `9 firis = datasets.load_iris()- J0 L" s" D0 `! A7 I8 l% K4 V3 h
    x, y = iris.data, iris.target, j: n+ s  w5 V- B8 F1 G$ C8 V
    pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
    ' F; ~: u. P9 D0 @7 U& t                       columns=[
    ! K0 a  |$ d7 R0 ]  r# l# A1 Z- u- i                           'sepal length(cm)', 'sepal width(cm)',
    / p; j: ~( F" j                           'petal length(cm)', 'petal width(cm)', 'class'
    * f, w, y8 Z! W2 m                       ])  D1 S$ ?" s/ ~  v+ Q
    with plt.xkcd():7 M2 U, f4 B: Z% ^9 v4 d+ _$ o
    * c7 a, W0 s- Q5 T' B$ f/ e2 l& \) |8 u
        plt.figure(dpi=150)  #设置图的分辨率
    : g$ q  S/ n2 E. M+ I) V! |1 s8 d    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图+ t, e0 c! S/ H; I" ^
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类5 }$ P7 M6 F* D+ L4 o  b
        iris_name = iris.target_names  #获取每一类的名称
    - M+ Y) o& T5 H( i8 e: S. d    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
    * I. H  S* v4 T3 V/ ^/ o8 z    markers = ['$\clubsuit$', '.', '+']  #三种不同图形
      j" t0 t9 P! l) x: C# h ; ?  N( _. d6 n3 n6 G
        for i in range(len(iris_type)):; V: e7 h5 c% Q. L0 `
            plt.scatter(
    - ]6 a- C2 p+ L8 O, d% w2 G& f  I+ I            pd_iris.loc[pd_iris['class'] == iris_type,/ B3 a$ W" {4 C) Y7 I- D
                            'sepal length(cm)'],  #传入数据x
    3 j' d: o, a1 F            pd_iris.loc[pd_iris['class'] == iris_type,) L" g- J6 K6 @$ ]+ x' X- s+ v
                            'sepal width(cm)'],  #传入数据y
    0 w7 w6 A3 K* @, A( a) c5 Y- _            s=50,  #散点图形(marker)的大小% v# D8 j: Z# u; M
                c=colors,  #marker颜色8 |& f3 ]" Q, Y
                marker=markers,  #marker形状
    * q5 O) j# v8 {2 `/ ^            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充. ^1 J) b* M3 P  f( h# r
                alpha=0.8,  #marker透明度,范围为0-17 F+ @- }( l) \! \
                facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c6 c/ `- `  Y3 ~) Y9 n- e/ p/ J# t
                edgecolors='none',  #marker的边缘线色$ u2 J- n% c( ]: o. R' |
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    & N2 t/ ?$ ]5 Y) J            label=iris_name)  #后面图例的名称取自label
    $ y' z! U6 |( L% L; p; u ) Q' O% ?: [3 F/ J& F) ?$ [
        plt.legend(loc='upper right')
    # d; o0 m7 u/ N
      C( E7 T' u' x% X! h8 R
    ( e+ u0 c+ v0 Z! a8 ]
    ————————————————3 l, @- p! r1 Q
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ; C% l1 O; P( f  H8 A* |原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753- |; t# ?# X. [/ e1 I* O# Y6 @. ]
    ! y: @" Q& e8 b: {+ X

    3 \) h$ ^& z4 x6 e
    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-6-3 01:54 , Processed in 0.482222 second(s), 51 queries .

    回顶部