QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5541|回复: 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
    $ R+ K7 C  h9 u( z# C8 n. a
    一行Python代码有多强,可让图形秒变「手绘风」
    % w4 T6 P0 \$ c之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具$ ~/ I6 a! F0 E6 `

    # L6 n- J' m+ w8 R/ g& ]& K1 f

    ( u4 U3 ]" E+ O0 s  w' b但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。! I1 B, o& \) z9 c( c/ \/ H5 ]

    1 c3 _$ i5 e( \3 l! l+ Z5 d  S
    0 @2 ?0 W! p& X) i+ p2 l
    matplotlib.pyplot.xkcd()简介
    + J4 W# W9 ?4 F) K/ T& T# V这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    8 s* k2 W! |- _1 a4 h5 l
    5 R; |' O) o% h, \1 c' g' J

    ) j( x3 a! `( l. i5 Ymatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
    ' @) e/ s+ z: h6 E: m0 X, p                       length=100, #褶皱长度
    8 f) t% e' O3 `- F- A( t; f) e+ b. p, x                       randomness=2#褶皱的随机性: S" c: ?; V% N) R4 ]! f
                          )3 q6 G! l& j/ u1 @6 L& q* Z
    matplotlib.pyplot.xkcd()使用# k! L8 v+ h7 o. D' N! X( r3 g; x
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    ( `+ ?' {; U. k  C% c- n) z
    4 X  i; P* V( Y; S' _

    + U8 T2 i- _6 n2 n) x5 \7 iwith plt.xkcd(scale=1, length=100, randomness=2):+ q* {7 ?' C- f3 @( C# i
    #with是临时使用一下,不影响其它图使用正常样式5 B8 S0 W0 I! `" h4 H
        绘图代码7 M; x1 G# s' \# y& w7 b
        。。。。。。( `8 v: |2 |/ K$ R4 a7 r
        plt.show()
    4 D+ e/ V6 I( l! gmatplotlib.pyplot.xkcd()使用实例
    5 e2 |$ i2 {/ Y/ c  c下面代码为pythonic生物人公众号之前的文章代码
    0 W* A0 H" e8 Z/ |3 Z" h' M% g; z
    2 m/ l; f6 X; |7 q8 W  F
    . o1 n6 |+ [- X; i9 q
    以下参考:Python可视化25|seaborn绘制矩阵图5 t& b+ e' f6 p
    ; H  W' e/ K: V5 _4 n2 L4 x

    1 D" u% |7 L+ j' E#支持seaborn/ x0 G# F5 w! |' L8 ^
    import seaborn as sns
    / W  [& b$ }5 G2 X4 w, q( p; oiris_sns = sns.load_dataset("iris")
    % ^' i9 l$ O, H6 P/ Nwith plt.xkcd():/ ]8 w3 K$ L) c! k
        g = sns.pairplot(/ E7 K2 `- q7 e0 B: k
            iris_sns," j; B2 ~, W4 g7 ?
            hue='species',  #按照三种花分类
    ; O, m2 Q8 K/ y5 C& ?$ H- k        palette=['#dc2624', '#2b4750', '#45a0a2'])
    $ W) m( \8 x6 O5 C% n7 `$ `6 i    sns.set(style='whitegrid')+ x( J/ @: @; _. J0 L
        g.fig.set_size_inches(12, 12)/ ?0 b2 r9 |, R$ X* Q0 E
        sns.set(style='whitegrid', font_scale=1.5)3 p8 D3 _2 d& C# R& W
      
    - Z8 H; u1 o; A7 Q9 y+ P/ Y
    ; K3 s/ n; K+ L5 A0 e$ Q, t
    , Y+ b2 f; M! z% m# k+ N6 U
    以下参考:Python可视化29|matplotlib-饼图(pie) : h( x/ _1 f2 Q2 h* |7 c' O
    , I0 t: L" S, A- m; B# V: ]- ]
    ' ^+ K; ~8 ^* V! y  A/ a
    import matplotlib.pyplot as plt
    ! j0 q1 A6 s1 ewith plt.xkcd(. p/ s. G0 k' a. L8 F. B
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度3 {( i/ F  v4 [; F& g
            length=120,  #褶皱长度
    3 g  ^' F0 [9 ^  Y. T6 `9 x3 w2 _        randomness=2):  #褶皱的随机性. n8 H* H1 y0 j/ T! t/ X
        plt.figure(dpi=150)/ A5 e: F% v2 Q7 E2 z# n) o5 [* r
        patches, texts, autotexts = plt.pie(: H$ F/ j% j; Y  F  }+ m
            x=[1, 2, 3],  #返回三个对象
    + E! w+ y" Z1 j        labels=['A', 'B', 'C'],
    ; m4 `' G  a+ i& C4 v2 m6 x        colors=['#dc2624', '#2b4750', '#45a0a2'],
    8 E. \; Z  G3 @+ ^( Y2 A" k        autopct='%.2f%%',
    + l6 O! y  z% N/ I" h3 C        explode=(0.1, 0, 0))/ j* t+ `) A: k! {# L" G, i
        texts[1].set_size('20')  #修改B的大小
    : @; c6 H4 U' p+ u8 v# r) t
    9 B3 p8 O1 @0 w% N" F9 x  @: A! |    #matplotlib.patches.Wedge, b$ t! j( {7 D. r; x% S' ~# d
        patches[0].set_alpha(0.3)  #A组分设置透明度
    1 m( b3 [$ d6 P$ q9 V    patches[2].set_hatch('|')  #C组分添加网格线, _( X2 ?0 y$ ~, p9 k) Q- E( s
        patches[1].set_hatch('x')1 b5 [0 k6 s& p1 W! e, C7 D. ~/ J/ v
    , l% ^7 W  G/ O- b
        plt.legend(
    * i* L7 m, p- v; `: p% i        patches,
    " ?+ E  z% m, R) `& R        ['A', 'B', 'C'],  #添加图例! i& w! B, D, b, X+ C) @
            title="Pie Learning",% d/ i4 l1 |& u( I" T- O3 h
            loc="center left",. D# r$ F3 L7 _
            fontsize=15,
    . f, d6 [: K9 M' z        bbox_to_anchor=(1, 0, 0.5, 1))
    . N6 [1 t9 l5 E1 c" W7 I 9 f) ~5 g1 V; I+ b5 c) J( E' u
        plt.title('Lovely pie', size=20)( H0 ^/ V9 z  M4 ^  j- |% o
        plt.show()
    8 r: i9 J4 C% Q0 B$ O5 u3 Z% \0 m7 W0 c
    * W+ {" d$ G2 j& E4 g! C
    5 i+ q9 ]& _1 J' Q# c% w) F8 F

    ' ~3 N6 c- |- o2 [/ s) w, N7 `$ }7 mwith plt.xkcd():
    9 T9 N  K: B9 u; L& a    from string import ascii_letters" p0 a, O- W/ k9 |5 v* z
        plt.figure(dpi=150)
    + I0 L, ~9 @' y- n$ s    patches, texts, autotexts = plt.pie(2 k$ p9 C& n) a! @! k
            x=range(1, 12),. ]2 T1 S; ]9 ]1 f2 e1 h' n& P! d
            labels=list(ascii_letters[26:])[0:11],
    ( {: q. e/ _; ]2 ~* _+ `5 c% H        colors=[
    9 K5 |7 o! ^( H( A* c            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',7 o  d5 ~1 e0 c1 q5 M
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf', L, f2 ]( S( G
            ],
    % Y- ]" N  n* T9 k3 T$ G, `5 t        autopct='%.2f%%',/ D5 @+ u- y' P/ G
        )
    8 j2 ^: L: A- q$ {& y    plt.legend(
    9 z( y8 a" z9 D$ E9 k7 S        patches,
    % h6 s& Q3 }' I) t        list(ascii_letters[26:])[0:11],  #添加图例( d- V7 T; x. p/ N" v
            title="Pie Learning",! w; p( y/ A7 m! S7 e3 [" o8 Z
            loc="center left",4 \) h6 J/ A- D" S$ b+ A. Z% V
            bbox_to_anchor=(1, 0, 0.5, 1),
    * `0 O& K! i2 J        ncol=2,  #控制图例中按照两列显示,默认为一列显示,) a* \3 t. o2 H" ?+ C, W
        )  l: S3 A# G, H9 U% i" m
      y+ _4 u0 v( s: d6 N, T1 x
    , p: W. A5 d2 q% J" y9 t

    : \4 f, @0 c8 U9 K0 D
    7 H: o( s$ A: ~( g
    import matplotlib.pyplot as plt3 Z( h3 k2 Q* ?; D' U
    import numpy as np) ]# `& q& z) e, w+ i! Z
    with plt.xkcd():. E7 |" W) q( R/ j6 G
        plt.figure(dpi=150)
    6 l% \, l3 x7 y7 L4 l) a- _    labels = ['Jack', 'Rose', 'Jimmy']
    ' y& \( w$ Z2 c2 G( c' T    year_2019 = np.arange(1, 4)
    & ~- L5 r8 ^( ?/ `9 T- p    year_2020 = np.arange(1, 4) + 1, D* Z; D! a& N3 X) Z0 Q
        bar_width = 0.4
    7 d+ d  ?5 t! o% ?  b
    7 j' \, f- h1 _3 q    plt.bar(
    . M* r! h) G& B8 h        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    6 q. a9 a3 ^+ g1 y0 b6 l& |        year_2019,) `* r& M0 l: I2 h( u7 G7 K0 M
            color='#dc2624'," G* B1 P, j, I9 h) w) @  x
            width=bar_width,% Y! h* J; U* J+ f1 B* b% {
            label='year_2019'  #图例
    * V2 A! {# e- d" ]! r4 J: P' Z    )
    ) V+ r# @) ]- v4 s    plt.bar(8 {. X; ]# m% }, `4 U* A* y
            np.arange(len(labels)) + bar_width / 2,: C8 q4 Z# J4 z: h* w" G
            year_2020,
    8 c6 `. [1 K; E: [; M        color='#45a0a2',
    1 u6 x+ `' @$ }/ m! s7 ~        width=bar_width,# j6 Q. r/ s1 m- t. j
            label='year_2020'  #图例- c7 |% y1 |5 O( c* y
        )
    $ |' x) ?% z% G: _" @9 K. N    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称+ w' c( i) V5 I6 G1 C$ N+ s0 m
        plt.legend(loc=2)  #图例在左边8 m: K' |* r6 U
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
      n8 n) _+ [3 D9 |
    2 K: ]! b* E, x- x  d8 }0 ?
    - {- A8 l& }: Y9 D& \; }/ r

    7 ?  c  w6 ^6 S) s
    1 \  _# d; N+ l7 ^7 Y

    2 s  x; W! T: Z, I) W' H7 f2 M
    : C- C/ t7 d4 b: M5 m
    以下参考: Python可视化|matplotlib10-绘制散点图scatter- L; n' D$ d2 ?. w! E

    - e' |# ^9 N* }9 n

    , D$ \, K% ?, aimport matplotlib.pyplot as plt9 H5 W; `: P  \9 D1 B; C
    import numpy as np
    , X7 `) B! s& R) |import pandas as pd
    % l9 q( ?& L# t5 Kfrom pandas import Series, DataFrame
    $ @5 H: Z2 k5 S) @#数据准备
    6 Q7 I  @+ h) rfrom sklearn import datasets. }5 P9 b7 X( r/ W# I1 I9 i. k

    + Z7 T& \4 {/ H5 n6 Q4 Firis = datasets.load_iris()
    4 m! u$ U9 k" n1 Ux, y = iris.data, iris.target
      ^- {4 T( W0 L% {2 s5 P1 a7 Ipd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
    ' I( N% m8 m, M: c9 ]( R                       columns=[# r4 A2 F! ^( l2 }% A
                               'sepal length(cm)', 'sepal width(cm)',
    . z. w. W7 x7 |+ s, _                           'petal length(cm)', 'petal width(cm)', 'class'% t- S7 @" Y: g& O+ z4 u9 v( Z% t8 }# ]
                           ])
    # S$ j& T. a; z- |with plt.xkcd():
    $ f# i% x* \4 X0 r& |  b2 I
    & k) ~7 n2 g  C; @! F$ |( N# u6 m2 j2 G    plt.figure(dpi=150)  #设置图的分辨率+ B0 n# M6 o: z9 b
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    + ]0 U- j3 G- Y9 A: Z" @    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
    3 G9 K. J" x& v    iris_name = iris.target_names  #获取每一类的名称
    8 c; N- m( \. x1 o6 h    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色& n6 x* ]4 `9 r( @& C
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形
      h/ F* z1 ~/ V. G  z ) `: P' R9 a" Z  \
        for i in range(len(iris_type)):, u( n: |6 _  L/ G
            plt.scatter(1 p6 b% l3 L6 X" Y& V0 D5 E
                pd_iris.loc[pd_iris['class'] == iris_type,+ ]; i. h: J. f5 J/ |: J  \! v
                            'sepal length(cm)'],  #传入数据x/ }4 V3 O( \+ L9 r
                pd_iris.loc[pd_iris['class'] == iris_type,
    ' h0 `3 E, F! a                        'sepal width(cm)'],  #传入数据y( w( R0 W; \5 j/ b3 `, C7 R
                s=50,  #散点图形(marker)的大小
    * r& t& X% _4 x" ~/ K- n- _% z" Y; ?            c=colors,  #marker颜色6 ]" s. x' x7 B
                marker=markers,  #marker形状
    ' `. b+ v! h. F& P& [, d            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    ! c1 u+ A5 ^( J3 A1 C            alpha=0.8,  #marker透明度,范围为0-1
    8 w: q4 P/ ^$ P# _: y% Y            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    $ e: p& z% j1 Y            edgecolors='none',  #marker的边缘线色
    6 @  I& X1 p, S& W8 J  |4 ~: h  M0 ^            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    & O: D$ @9 L  \9 a            label=iris_name)  #后面图例的名称取自label
    * c5 O, }  B7 ~0 C- H+ X% C0 ? ! X- z1 a  b( X) v+ o/ Z
        plt.legend(loc='upper right')
    / K4 Y5 X! m% Y5 L# t! e2 @& h$ D' K

    7 Y; ]. q& I+ {! |————————————————0 u* i' {! P8 u4 H( u
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 z9 C' R. w. z4 D: \& f9 O% L% D
    原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753) ~& H/ r* f0 ?1 ^. L" C

    . O& L- \5 x1 P7 F* w2 R9 h! s+ j1 m! X1 C9 w& 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, 2025-8-30 03:14 , Processed in 0.418313 second(s), 50 queries .

    回顶部