QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5490|回复: 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 o, f  u+ V5 B6 F7 V一行Python代码有多强,可让图形秒变「手绘风」8 C3 ~1 i4 U& i2 {8 x2 R9 E. V/ q, O- N8 U
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    8 u* |) e( O0 e- @0 U1 I1 o5 M" y3 H7 _3 l7 m" x' w

    6 M2 y! v$ k* U6 U) E% x但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    & ?2 t; o4 |' f7 n1 Z' g& H8 L; B6 i4 p0 A% T3 c4 ^' F2 ?8 L
    - `$ {. V( Y  N
    matplotlib.pyplot.xkcd()简介- H2 h" v3 ^! }5 U6 O
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小2 s. l) y5 t0 M" a
    ' s6 G, S5 W  O4 s9 Z( P

    ) _8 G( y5 P- m; E; L1 Wmatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度( H; v' I8 W- m
                           length=100, #褶皱长度
    . r' L1 s5 S% k1 A" i9 s+ T                       randomness=2#褶皱的随机性. @* w3 r- L- Y* U
                          ), S2 d' Q. c* v6 z# k
    matplotlib.pyplot.xkcd()使用4 Z' d" I6 Z! w  Z, D4 z
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~# z- _% n9 u  L- f, j

    / k. D9 g! V4 w% w6 }, O
    7 e6 \3 m0 s3 i
    with plt.xkcd(scale=1, length=100, randomness=2):0 U: X6 y. `; O
    #with是临时使用一下,不影响其它图使用正常样式
    , T7 h0 T* D# g( t' z    绘图代码
    ) k% H% w0 m  p3 t( P6 w    。。。。。。
    - a+ q, `& c; M1 t, j. ^    plt.show()9 W* `2 F. F: @7 p. h
    matplotlib.pyplot.xkcd()使用实例
    . O* N6 l* a" A4 x2 x& }7 M下面代码为pythonic生物人公众号之前的文章代码1 T$ B, n" T( |  |& b
    / \5 R+ x$ e0 {; l: s( o# ]
    # y0 d0 U' p8 A0 ]3 M
    以下参考:Python可视化25|seaborn绘制矩阵图
    & G" s. E. s( e+ ]/ W
    8 E  X5 T" Y! s- n8 S, m
    ; |4 k$ F8 t5 a6 J$ s' h
    #支持seaborn/ \9 r" l( d9 b' h
    import seaborn as sns
      }4 r8 x$ `7 z0 ?0 F2 yiris_sns = sns.load_dataset("iris")6 q5 G2 [# a/ T% F8 Q$ N- J
    with plt.xkcd():, e: m  `  q5 H
        g = sns.pairplot(
    4 s- {& @9 V% @/ A* H        iris_sns,
    - `, z9 l* A0 m! R        hue='species',  #按照三种花分类
    1 l8 p  M! q: u5 z; \; P        palette=['#dc2624', '#2b4750', '#45a0a2'])0 V/ b. \" {- \- D0 E3 R
        sns.set(style='whitegrid')* G! ~  ^' u/ D" ^* V/ H
        g.fig.set_size_inches(12, 12)$ X9 u# \5 N( L8 r! I+ \3 @: m
        sns.set(style='whitegrid', font_scale=1.5)1 g$ ], V. |0 J. w: F# x& M- L/ F
      $ C4 }! W; p  e
    ; k3 c+ I& k! Q! \4 U

    $ \5 n! H! g3 F' m* P+ V( G以下参考:Python可视化29|matplotlib-饼图(pie) + M" x- y# P0 w5 \
    ( q6 n& t; g6 Y4 ~
    , X  d% B: r8 Q( T# \
    import matplotlib.pyplot as plt
    2 w$ a: }. w6 T$ k' e  j, Awith plt.xkcd(
    / Q9 p7 F+ o( q+ Y/ h        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度
    $ {- n% U2 }# L) B        length=120,  #褶皱长度
    0 |* b( ]( W. x% u% E% i% n, P        randomness=2):  #褶皱的随机性4 f! X7 ^. `% ]5 |$ S$ {0 W
        plt.figure(dpi=150)) J0 k! |; ]' `  D' ~6 c$ p8 T1 Q! i
        patches, texts, autotexts = plt.pie(
    , l- c& R- i0 I& O0 l7 x( r        x=[1, 2, 3],  #返回三个对象' \! O/ _8 d2 ?
            labels=['A', 'B', 'C'],  e' s2 H6 X5 Z
            colors=['#dc2624', '#2b4750', '#45a0a2'],* ^9 ^- T! X+ a
            autopct='%.2f%%',/ Q! G# l& i  S8 W& W) D- f  W
            explode=(0.1, 0, 0))5 Y+ e* U) L, [, ]8 B
        texts[1].set_size('20')  #修改B的大小$ x1 q7 _! B+ q" Z: m- m
    * d. @0 p  j' n/ f
        #matplotlib.patches.Wedge
    - g9 h8 Z% d" l9 t+ s: r) r! d1 Y( Y    patches[0].set_alpha(0.3)  #A组分设置透明度) g! t2 u( S, M3 A; a/ E
        patches[2].set_hatch('|')  #C组分添加网格线! L+ n2 l! i9 l5 {* b. V
        patches[1].set_hatch('x'); ?' R' t6 i. b# _, d
    7 h+ A. K2 q* Y: R- i+ H
        plt.legend(9 f- i& d7 Q. P5 |$ }1 n  Q. n
            patches,
    3 Z) X8 V1 ~; h+ V( I+ N        ['A', 'B', 'C'],  #添加图例7 U9 P" }  i- e. e
            title="Pie Learning",  s/ w6 E" V/ R5 q/ w6 m8 Q) g5 }
            loc="center left",2 v& J0 F; e& h( x1 s7 M
            fontsize=15,* W  [' a4 o3 [, \
            bbox_to_anchor=(1, 0, 0.5, 1))/ M* {; _. w0 _3 d
    ! [4 |* W* Q6 @1 @
        plt.title('Lovely pie', size=20)
    0 a, @- l; N, m. d4 x. @; z/ g    plt.show()
    ; L$ R# s9 J% e2 F, W+ E
    3 q6 z& D, T+ U1 O5 f6 n/ v

    $ f. J5 v4 R; O. s( X8 T4 i& X# {: n! `* n( [. z

    / X2 @+ M3 L/ y7 R* Uwith plt.xkcd():# _% H, q' G" D, U
        from string import ascii_letters0 R, p+ Q0 P2 L) g/ d
        plt.figure(dpi=150)
    * K5 j  g! B- Q" ?. I% c3 N  o    patches, texts, autotexts = plt.pie(6 n; O1 i, W) K, b% c
            x=range(1, 12),
    ; A/ _% [- @5 _0 s* L2 I        labels=list(ascii_letters[26:])[0:11],
    ; s+ b3 _9 I6 G* |( \        colors=[
    + y) v1 p; I& ]% W2 ?) I            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
    & m" _$ e5 j8 Z8 f; ?/ p* p            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'2 o7 p8 M' y5 J
            ],: o! c' e) V$ Z
            autopct='%.2f%%',0 a: l- ?$ ~2 w- {' c5 F% l4 ]
        )# ?# k4 b7 s6 L( ~$ ?) m9 h
        plt.legend(% R# D" U0 H0 l% W' U; \! I# C
            patches,$ m! B  M5 ]1 K: ~. s
            list(ascii_letters[26:])[0:11],  #添加图例
    + l9 s$ C9 a/ V" L        title="Pie Learning",
    # [8 R* f6 q( ]% P& r, N# `        loc="center left",! E$ [- E6 b* U, y
            bbox_to_anchor=(1, 0, 0.5, 1),
    : x- {; H, \5 L  c. `: S2 R        ncol=2,  #控制图例中按照两列显示,默认为一列显示," x) V7 S+ S# l
        )) Q( L5 D' s- S% @) M" \- c/ e

    2 Q+ K. E7 d3 n: P) F1 T) ~

    8 R  d: c7 X+ F5 X& P& S7 b
    & A+ q" H4 {  x; u; s& L7 w5 u
    6 |  i( U/ p$ i3 L
    import matplotlib.pyplot as plt
    2 d: A' r5 o* Z2 G! r+ z+ rimport numpy as np/ Y" m7 @1 H' m! J9 ]$ B5 b
    with plt.xkcd():  O* _& S9 U0 O+ o
        plt.figure(dpi=150)
    # F  t- ?2 w; a8 e, U    labels = ['Jack', 'Rose', 'Jimmy']
    3 s! \" p8 ]  z4 D    year_2019 = np.arange(1, 4)
    9 [! K! b+ A1 j) ~$ p: J3 }    year_2020 = np.arange(1, 4) + 1
    ( J' {/ ~$ v7 d7 o4 h    bar_width = 0.46 s, O# G, p% U4 O" f* H) x  u

    4 Q! X8 t( M+ x4 h+ X2 B" g0 G    plt.bar(, I; a/ d2 }" j2 i; t0 F6 g8 j
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    9 m1 d; ?8 H3 u+ h) S6 \$ G* H5 C        year_2019,
    & \" Y9 U0 o6 d* x1 `        color='#dc2624',
    % j3 l4 E8 j% {4 ?        width=bar_width,
    # H9 }4 ?7 \' s. W; D4 d- d2 r        label='year_2019'  #图例
    - \  a6 f$ x: ]2 d$ g- j! i    )
    7 @; ^3 u( m& J0 H    plt.bar(, B' B1 N; d' O- Y( K
            np.arange(len(labels)) + bar_width / 2,
    8 V% m! S, Q, g$ F: u7 P        year_2020,
    ' D+ b! V4 r2 v- _/ S' p3 F) Q        color='#45a0a2',
    * r& @8 v  ~6 R9 e1 J' l- ?        width=bar_width,
    ( b+ g2 S. I! w; e& ^; C4 W        label='year_2020'  #图例* F" p+ T* G  H2 [: l7 k
        ); G. h( B, _/ e4 W$ I
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称* G5 x- I* v: b; K- f: b; f2 ?7 |
        plt.legend(loc=2)  #图例在左边' S. g' M5 A: k/ ?: V) T
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
      @( t0 a0 S9 h' s! M+ ^$ Q. |  U: G% _& ^
    # |  v  ]# p2 }6 z
    6 V  V! V) f( Y0 M/ B6 x- j' w" A

    4 G( \% T# T& E) F. j% X+ I+ C# s7 ?

    7 x; C1 ^) l5 Y' I$ C以下参考: Python可视化|matplotlib10-绘制散点图scatter8 G4 D( n8 E1 b8 ]. r8 X4 j
    $ k1 S3 A$ w: {) D: [

    ) @- w  n! @& w& Y+ s# h4 y/ ~import matplotlib.pyplot as plt
    . a  d# V+ {  D% T7 w8 P+ ]import numpy as np
    & ^% [8 H9 |; z( r' d$ N4 Pimport pandas as pd
    4 V1 @! {3 d0 K. efrom pandas import Series, DataFrame. R8 H9 J/ B+ w, d
    #数据准备- t6 r$ {5 Z' i8 _: {) o8 J( d
    from sklearn import datasets" m  o+ H$ m. a0 K
    2 p7 g" b4 a% N# h' ]- \/ x
    iris = datasets.load_iris()9 x/ P, Y& O0 E  e+ e- _/ D) s
    x, y = iris.data, iris.target
    $ n9 X6 X6 \8 f& k5 xpd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),6 v) y, }* W& z9 v. o
                           columns=[
    : q3 G# u& g$ }# B$ H                           'sepal length(cm)', 'sepal width(cm)',
    - i+ A, T5 p# o- }' x                           'petal length(cm)', 'petal width(cm)', 'class'
    ) A. N: s) t+ @, h                       ])
    / w0 G$ `, B/ ~. j( \- Dwith plt.xkcd():
    ; L' n) v6 |! W: i3 C% S5 G2 |6 E0 w 6 r" O0 m4 r* v
        plt.figure(dpi=150)  #设置图的分辨率
    & ^; |( j9 X  j    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    ! m7 s1 h% _- o4 m- p: P    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类/ X* R) b! |/ v$ H2 }" \6 h: X
        iris_name = iris.target_names  #获取每一类的名称# j5 f* R: n. Z( v* e
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色: L: P, |% Z9 J
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形! b& k! }9 ^+ M% G

    1 T: V: _) ^8 S- Q    for i in range(len(iris_type)):
    ) ?' v3 e* h( {! a        plt.scatter(6 m' u* P! h3 j6 m
                pd_iris.loc[pd_iris['class'] == iris_type,
    1 H  Y) N3 F3 e+ z& A$ a* U                        'sepal length(cm)'],  #传入数据x4 \# ^; l" t  ^5 p+ r
                pd_iris.loc[pd_iris['class'] == iris_type,' r  v' T" \' o$ o* n9 M' U9 b
                            'sepal width(cm)'],  #传入数据y) f% E- \9 w. y9 o' m8 T
                s=50,  #散点图形(marker)的大小
    * R$ z" q3 M5 |2 E! o            c=colors,  #marker颜色, h# l! o6 s/ d1 R. }
                marker=markers,  #marker形状7 D7 F7 @) ]" ?' {4 F
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充: W, I3 X9 b+ K% f8 O9 z3 p5 f0 m
                alpha=0.8,  #marker透明度,范围为0-19 R' b5 w3 u0 ]5 V4 P4 W0 Y
                facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    5 }  z) b# r5 H% |) O- F& y, M4 f  a1 o            edgecolors='none',  #marker的边缘线色" y+ g1 q' y2 N/ V8 f
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用" O8 R; o- C  v6 X5 n/ o! i
                label=iris_name)  #后面图例的名称取自label
    + @9 _4 A: g- H5 B : ^( N: E! x  v0 D: @0 Z' t( B+ |" a$ W
        plt.legend(loc='upper right')
    0 s5 ^9 Z( c5 I7 r: y6 h( b6 J# P
    5 N8 Z* A+ ^3 z& U: _" r
    : A( O% Z' z7 c: n% e. P6 b5 e
    ————————————————
    * x7 J, i8 j7 T' e版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    4 c. a. q& y% s原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
      }3 z! }" x3 {) N* Y! [
    % b+ A, j9 L+ I) i1 A; O" C+ `$ E* Z4 o
    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-20 06:32 , Processed in 0.280697 second(s), 50 queries .

    回顶部