QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6223|回复: 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
    0 ]- |" H% d! ^# |* D7 r, ]
    一行Python代码有多强,可让图形秒变「手绘风」
      |/ w% m0 |2 u0 p; l( n之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具7 P* ]* r$ o0 _( \# R
    3 c8 T. J; L2 }* e+ C3 C6 |. [

    9 _: G  s9 ^/ z+ T* `8 ?/ D+ V但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    5 Z. Z% {) V# w! B% Y
    : k2 H5 @$ {8 M: k. d9 w! ~) |8 S! h% {

    3 v( n" p/ o0 ?* Z- q& Kmatplotlib.pyplot.xkcd()简介+ N) ^) v$ y/ O- a) q+ D" Z
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小& w! v" l( P) X$ B% n. }1 y
    9 u- p. {. P2 r! K. A- R% k
    0 \; D: H# u. |
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
    7 _+ ^+ V6 C* E1 N. x% A                       length=100, #褶皱长度
    1 x$ ~2 v- D/ Y1 i1 z# e5 u                       randomness=2#褶皱的随机性# A+ j- Z4 E2 d6 G5 V/ `1 b, t5 I9 @
                          )
    " c0 E  o3 O1 N  o2 S1 m- G* |/ zmatplotlib.pyplot.xkcd()使用
    - m& n, Q4 i, k9 g9 H2 _. s# Y! x# X如下,加with行代码即可,括号中参数按个人喜好决定是否设置~' X0 {3 a' z6 y7 G& ]# U8 X! M

    " q  `. s6 Q) I2 N: Z  `5 y7 f3 [) P

    * t  |: ^; L' |1 Z$ |with plt.xkcd(scale=1, length=100, randomness=2):
    & l% M1 u: W8 ?5 K& ]#with是临时使用一下,不影响其它图使用正常样式, y* C* d3 J0 c3 I1 w% D& }
        绘图代码+ v8 ?  z6 A" L" Z5 |
        。。。。。。) t% b0 [6 v+ O( j
        plt.show()3 P+ u' z, F4 W5 m
    matplotlib.pyplot.xkcd()使用实例 1 X' ^, v  y/ M2 Z# T% q
    下面代码为pythonic生物人公众号之前的文章代码8 g5 V0 @% N+ w* [7 s8 U
    3 E  f3 ?; S  K, J4 d

    : q$ f  s3 {; X& T以下参考:Python可视化25|seaborn绘制矩阵图
    # g# \7 l4 k3 L0 r% _
    4 ?' u& i2 U; i' F
    ( b# V5 g! m0 }0 C: N5 t; u) h
    #支持seaborn/ L7 q& d- r7 j$ R
    import seaborn as sns: r1 n! t9 n' V, g
    iris_sns = sns.load_dataset("iris"). Z$ t. W7 q% C# k7 j4 c
    with plt.xkcd():7 @, w. Z5 Y. t1 p0 G; X3 m
        g = sns.pairplot(5 }5 R; T* E' v3 H0 p' z' V3 q
            iris_sns,5 t" G( B) E# H
            hue='species',  #按照三种花分类8 M/ y0 n3 V) i2 l( t8 q
            palette=['#dc2624', '#2b4750', '#45a0a2'])
      x! h) C9 g9 c  M    sns.set(style='whitegrid')$ g" G( {. \$ D, `+ t2 f
        g.fig.set_size_inches(12, 12)& ?- V: b) `) X* ]
        sns.set(style='whitegrid', font_scale=1.5)0 @) s* E: g' p# V, |
      
    / C) A) J, w4 z( ?5 |2 R0 d. `
    % P; z& U9 A/ `; [, x( p
    . U3 N8 g5 v+ @' [
    以下参考:Python可视化29|matplotlib-饼图(pie)
    ) I2 a( V& @+ a% `' Z8 @! P
    9 S) I0 J* c0 A" z4 M) U
    ; e* Q. ^* V3 b" Z
    import matplotlib.pyplot as plt
    " Q9 e- d5 D. D4 Q2 r# P2 X2 x$ o5 Wwith plt.xkcd(
    # ^/ K- E% U3 g3 u8 Q! w3 g        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度
    , R  T* T& P9 W( r0 V7 M        length=120,  #褶皱长度; x- p4 x- f; @5 {8 P0 D
            randomness=2):  #褶皱的随机性, E+ o# G7 ]! A2 P, r3 ?, _* U
        plt.figure(dpi=150)
    # }, f1 ^6 l: X( w9 w  N    patches, texts, autotexts = plt.pie(
    * |1 I- `7 m4 f$ v* N        x=[1, 2, 3],  #返回三个对象' [" R4 I# |/ [* d1 F4 v6 F
            labels=['A', 'B', 'C'],+ C, }! H# p  Y* Y$ S1 n! F
            colors=['#dc2624', '#2b4750', '#45a0a2'],
    + ?8 u! K, c. [( T! [) u        autopct='%.2f%%',8 ?, m5 J! I* f' x
            explode=(0.1, 0, 0)), I* ~0 m, S8 t8 c1 c
        texts[1].set_size('20')  #修改B的大小. \: J1 q( I3 D- x8 Z4 ?+ e: b& J# t

    " H- f3 i1 y( k. a/ o    #matplotlib.patches.Wedge' ^4 q# f2 X" q+ m) k' `
        patches[0].set_alpha(0.3)  #A组分设置透明度0 `  x) C7 @$ i0 M. l% t, R$ N
        patches[2].set_hatch('|')  #C组分添加网格线1 ~0 n# V2 a5 z/ L$ \, h  H& y( j
        patches[1].set_hatch('x')& X: Z6 c: K- ]. @

    & j) `6 c' z6 A. _( J) G5 Y; p    plt.legend(+ v( j1 G4 ^4 y
            patches,, D1 u) M9 N, n+ l
            ['A', 'B', 'C'],  #添加图例
    & U* ~$ V0 N* ~: `8 I$ W  C3 e        title="Pie Learning",7 o) G0 ^) K* X. p
            loc="center left",$ P; Z& g/ B5 f# ]8 t- T
            fontsize=15,! J9 T: m$ S% l- s  w2 t
            bbox_to_anchor=(1, 0, 0.5, 1))
    " F; Y1 W: n, A6 f! `1 k+ l/ y
    # E4 o. \  ~7 ?8 y$ y    plt.title('Lovely pie', size=20)
      G. @7 H' V% |9 c3 C& g    plt.show()/ ~- @( h  _6 F

    0 J4 h" t" H+ C3 w
    6 p; R2 l7 s& ?% {7 H

    ( c* S3 U4 }; R9 x) }+ I" h$ N
    ; ^" Z; k8 m/ [( j
    with plt.xkcd():
    # J* i! i) o/ k; H# x  C$ k1 |5 O    from string import ascii_letters  m# C, P" h; T/ \0 C% ?
        plt.figure(dpi=150)
    . Z3 F( o+ U4 p+ K4 q$ v( r. z& O# j    patches, texts, autotexts = plt.pie(
    9 x$ d) l  q- [5 w7 C+ I        x=range(1, 12),
    / X* e$ E% x: B% g        labels=list(ascii_letters[26:])[0:11],9 y5 b+ g( d( F. \
            colors=[, F. J9 l/ |5 C+ g
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
    * I  h# l3 h0 }: Q/ P' R            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    6 ]+ ^9 b- F" T$ v" M- Q" X8 H        ],6 k- a0 c5 m2 U( H* d, |7 ]
            autopct='%.2f%%',$ H4 X6 C( i3 B, O" X: U( p
        )2 B4 T5 F# L3 o6 [. E; `
        plt.legend(
    + [% m( E  I2 ^7 [7 |" v        patches,6 `5 ~1 ~4 m$ h3 @5 [
            list(ascii_letters[26:])[0:11],  #添加图例
    3 M8 a3 q3 s. ~        title="Pie Learning",
    $ m+ v9 W  r: G( _1 k        loc="center left",$ K" w. j- n9 f
            bbox_to_anchor=(1, 0, 0.5, 1),0 M+ U! c& u' g  K. V# g/ ^$ Y1 C
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,2 G. \% m6 w4 \/ B- N8 H1 [% b2 J% w! |
        )
    ; ]: z, L  Q2 O2 L7 m6 N- C) r/ }( W. i9 V1 |
    7 Y. U9 |6 D7 ?

    6 P" g( y1 G) d' P+ X! Y, q7 D

    9 I6 O- h9 j! E5 i: Z3 N# N( _3 Ximport matplotlib.pyplot as plt
    0 R1 l8 j, l6 ^# Uimport numpy as np" o" P. o  F* o+ s& A
    with plt.xkcd():
    - {/ x9 x& O: C, L# F% u  Z* k; ^    plt.figure(dpi=150)
    # w+ x# I6 V" }; I+ G2 M    labels = ['Jack', 'Rose', 'Jimmy']1 Z& k( ~. o) h
        year_2019 = np.arange(1, 4)& |- n$ G% k( |% J2 x
        year_2020 = np.arange(1, 4) + 1
    ! v* k3 s% f4 [6 v5 ]# P    bar_width = 0.46 N1 S2 ?5 i: S$ h5 f' Z) ?
    * I) {0 r4 e# d- w' M
        plt.bar(
    % F  U5 p5 c& ^1 }1 _% t, E% P        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽: S* Z; a1 C% ]( k2 w! H8 v
            year_2019,
    9 W  W6 f4 Z7 _' q        color='#dc2624',  I" Y( T5 b5 d3 V0 }& b
            width=bar_width,
    7 ~& Y! h% e. u4 l7 ]        label='year_2019'  #图例
    , u% N" n0 m$ k# h    )8 P  b1 b' {9 f5 h8 X# L6 A
        plt.bar(& J* ~# b$ x: S- a9 ]
            np.arange(len(labels)) + bar_width / 2,+ l0 T3 q+ m' `6 Q7 S( C  Q( ~. ^
            year_2020,
    # `6 I; c% m& K0 b        color='#45a0a2',
    / s2 M  |/ K: z0 s; |8 G5 U. Y        width=bar_width,
    1 e. A- I- ]5 Y6 d" E/ {        label='year_2020'  #图例
    + x& V$ a7 |- ~0 M) f5 S    )  D" _; `0 T7 @- f( ?& \
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称
    / M( z: B' Z* v6 x: F% m4 j3 Y" k    plt.legend(loc=2)  #图例在左边
    / @. o+ N' B0 D  S) ]以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
    , V9 e8 V$ V* ^6 m1 e2 `0 M0 L6 E7 x$ E' l

    6 j+ G$ W4 w+ i  f7 b5 R
    - r- D5 e9 M% R+ N+ e2 f% ^; ~

    ; ~% c! O; \" n, `& G2 D3 h5 A+ K6 A) W( i

    1 M7 L% @; a5 Q, p7 u  n( P1 v以下参考: Python可视化|matplotlib10-绘制散点图scatter8 H! ]. @' E6 `  o

    6 u$ ^2 R0 q5 M
    3 b$ ^7 X  ~1 Y" k+ z5 W
    import matplotlib.pyplot as plt
    5 G7 \# U! W* i4 simport numpy as np
    9 r3 {1 x7 V2 M6 Uimport pandas as pd* c9 k$ w6 j& A: t( H1 v; J
    from pandas import Series, DataFrame; Q# L( i0 O3 p$ q9 y2 t- m, X
    #数据准备
    2 D9 ^/ w1 A% g4 }$ r+ j0 F& ffrom sklearn import datasets! _5 [7 c' P' [. F: y# j
    / t/ q/ _. B1 R$ A# Z
    iris = datasets.load_iris()
    - g- \; ^7 D/ b4 z; p8 }x, y = iris.data, iris.target
    - Y# v- A8 \2 K# G& b6 l! fpd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),# M& T( ^& R$ O( x1 ^2 M
                           columns=[2 H% n; H/ F" f9 k: P
                               'sepal length(cm)', 'sepal width(cm)',* u* b& e, D: R
                               'petal length(cm)', 'petal width(cm)', 'class'5 K6 R% R$ D; H3 p* P9 Y8 o7 H
                           ])1 k* l& Z' d0 o$ q/ \% D
    with plt.xkcd():4 p2 w0 Z) b4 C% a6 C

    # w2 a2 u. {1 S: T: h6 P) W: V    plt.figure(dpi=150)  #设置图的分辨率
    % l( N7 t$ @' {    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图: f% n5 R: \4 c% o
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
    + ?0 |0 d* T- [/ T$ H2 @$ H    iris_name = iris.target_names  #获取每一类的名称. ?" I* b# @# j6 B/ R' T/ q0 t
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
    9 X" R; q- @  I3 e8 }2 w$ L    markers = ['$\clubsuit$', '.', '+']  #三种不同图形  J/ ]/ z) a) Z( b" P  Q
    . n# c% ]) y, V% S" T  r
        for i in range(len(iris_type)):: Z, }; J1 d1 L% P
            plt.scatter(
    0 i4 e' r! E: c: u            pd_iris.loc[pd_iris['class'] == iris_type,7 s6 E; Z7 B2 W
                            'sepal length(cm)'],  #传入数据x  ~, V7 ?" y6 }; ]/ R8 ~
                pd_iris.loc[pd_iris['class'] == iris_type,2 [4 M* M$ \( _7 j" {
                            'sepal width(cm)'],  #传入数据y
    / P* l; k$ q2 j            s=50,  #散点图形(marker)的大小9 }( K. w' _7 y) Q+ ]* e7 {4 l$ `
                c=colors,  #marker颜色, y# B/ V$ z0 Q& p
                marker=markers,  #marker形状
    ( Z- q* J) W2 l/ x$ b3 V7 i            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    ) ~. L" y6 |# y4 D1 Y            alpha=0.8,  #marker透明度,范围为0-1
    + A+ P" X1 Q4 u4 u            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    , m. E- e: @9 O7 }: _            edgecolors='none',  #marker的边缘线色
    , X6 O7 o" a6 H2 ]( p            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    " @0 g6 @6 q! F( J            label=iris_name)  #后面图例的名称取自label
    5 G( V" i- J$ x# d! U * S9 m6 q+ @6 F1 {6 p! G- M
        plt.legend(loc='upper right')+ D/ R0 x+ ?3 c# x3 F; p
    " X8 R' k; N: T6 Y0 ]' S
      H7 I+ C8 }  P  H) ], C0 y
    ————————————————0 y* B8 t, F7 Y. g2 R2 j
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    & e! c  |8 Y8 S# o9 y原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753) \! J# b: T0 f3 {. d

    9 B' m+ C( o" h
    / F; V6 ]5 J& `" S$ R) w8 @. |
    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-4-19 08:55 , Processed in 0.405053 second(s), 50 queries .

    回顶部