QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6263|回复: 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
    4 Y, D/ l6 G9 i
    一行Python代码有多强,可让图形秒变「手绘风」- y- O, Z7 ]( {- x. @5 U) C
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具% B* J& w9 f! b4 H7 b$ P  K% j

    9 m$ u; t( D8 m+ S6 ^5 b
    ' ~( D' K2 d- u
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。7 A" }7 T& }7 i* [5 [) W7 C* q1 ?2 V
    ; d3 Z5 t5 h/ F9 B* P; e! Z& l

    ' N- z' p9 E3 J- E  Rmatplotlib.pyplot.xkcd()简介
    8 F' i# j0 }  q( C这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    % O" j: g4 y- b! ~( {, ]+ d$ I" G* ?- C& |" A

    $ t7 Z) c. W4 N- ~. \$ h8 y" umatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
    , p; m9 k- I0 i! W2 D                       length=100, #褶皱长度
    2 }5 A$ w9 M2 W% g% h; ^* v$ A                       randomness=2#褶皱的随机性0 Q: f9 K( _9 x& Z$ W* u* c
                          )& {, w* w0 r0 Q( Z- B" t# N) E$ Q
    matplotlib.pyplot.xkcd()使用
    7 L: H& Q7 z: X9 Q如下,加with行代码即可,括号中参数按个人喜好决定是否设置~% X; g1 _: j; q

    8 L% F# K# b0 Y& H+ n
      U, e6 [1 N4 C
    with plt.xkcd(scale=1, length=100, randomness=2):7 h1 P. I" \$ @" j  |7 x
    #with是临时使用一下,不影响其它图使用正常样式
    3 L: L2 O3 E+ O3 ~2 X& q# x$ p    绘图代码
    ( E' I) T6 g7 b3 |( a    。。。。。。$ b" A: d" f* Q+ T
        plt.show()
    2 P  P6 i% @7 y5 }4 {, R- M" Nmatplotlib.pyplot.xkcd()使用实例
    1 v: \6 F' o$ J  Y下面代码为pythonic生物人公众号之前的文章代码0 d3 _& c  O+ T2 x  O
    8 ~3 w/ B  @4 y* _5 ~
      s4 E  `: V2 |; q
    以下参考:Python可视化25|seaborn绘制矩阵图6 a  s: M3 @5 [3 o) k: g* p
    ' H. N* w/ M5 {  }' A! H. D0 e
    4 L3 d$ b  c' R9 W) R2 b' g" ^  U
    #支持seaborn1 G0 U6 I+ ^- m* s# L! Y) V8 V+ ^
    import seaborn as sns# e2 _) t4 B( o# W
    iris_sns = sns.load_dataset("iris")
    : y6 Q4 y, M7 _- o+ d5 D6 vwith plt.xkcd():( x  `( t2 Z; O4 D
        g = sns.pairplot(8 r' R' v; Y, D) X; l# a+ _
            iris_sns,$ b5 U: r, J( ?  b
            hue='species',  #按照三种花分类1 s8 V$ k+ v* q! O6 |
            palette=['#dc2624', '#2b4750', '#45a0a2'])
    % M$ }" o+ z/ i/ J1 _8 H    sns.set(style='whitegrid')" M) Z3 o8 `+ ]2 o2 D
        g.fig.set_size_inches(12, 12)
    - q; p  ^4 D+ _  O+ L3 |    sns.set(style='whitegrid', font_scale=1.5)
    ; k5 u% x' R& L. n8 m' X  6 f3 @) d) w3 C

    % _1 X% f  L$ {, d8 [' g. c

    + R* G9 [3 g, c, j* j' ]以下参考:Python可视化29|matplotlib-饼图(pie) 3 j. Y& e) Q! C, E! {! `
    * i+ c) ]0 n7 `9 q7 m

    % T6 Q; y, ~8 K% O. Q9 A1 Himport matplotlib.pyplot as plt  c2 T: s- h5 D- H$ v+ `/ O
    with plt.xkcd(
    # u5 y# A, @/ ~4 `, f        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度
    ( p9 `8 m( H- W( b& K0 ]        length=120,  #褶皱长度" Q! [, o4 N7 {- m/ d9 D
            randomness=2):  #褶皱的随机性7 w0 p/ A* G4 x, l  A; d  Q
        plt.figure(dpi=150)
    0 s' M2 @# Y$ i0 f  M& \+ B    patches, texts, autotexts = plt.pie(
    : r6 e4 M9 ]0 w" N5 e) B        x=[1, 2, 3],  #返回三个对象
    8 K6 l& [# l; N! T) ]        labels=['A', 'B', 'C'],
    0 Y0 }' U0 n. W  P        colors=['#dc2624', '#2b4750', '#45a0a2'],
    6 x& ~8 U9 @- Y  T* S2 \9 e, C6 p        autopct='%.2f%%',1 K2 P0 f# C8 `" w& ?
            explode=(0.1, 0, 0))
    0 A% n  ^% I2 o. _% _7 Y: n8 `    texts[1].set_size('20')  #修改B的大小+ K7 x3 x  f) P8 b5 W$ z9 r: C+ z
    ( Q  o3 a: w5 y4 f5 @! E
        #matplotlib.patches.Wedge' N' M- F4 O- M6 Z
        patches[0].set_alpha(0.3)  #A组分设置透明度
      Y) [& {9 V  s$ Z: U7 _    patches[2].set_hatch('|')  #C组分添加网格线
    % X8 S! B( E+ L' D    patches[1].set_hatch('x')7 i; w+ `% F# J; ?

    . ]4 e! m: t3 n6 j- W% C    plt.legend(
    * D3 q, T1 x- b8 {4 w. Q        patches,5 Q9 b# M% n9 |7 @1 t% t
            ['A', 'B', 'C'],  #添加图例- }; Z) P* `: D3 D2 I- l- J
            title="Pie Learning",! p0 G9 J, t: a* d
            loc="center left",  c7 J# ~7 p  |' c& L+ z
            fontsize=15,) \" \$ c5 q* O* p: e& b- U
            bbox_to_anchor=(1, 0, 0.5, 1))4 t& |2 q6 s% y
    * L# m: n, x2 d, B2 F  Q" q  \5 r
        plt.title('Lovely pie', size=20)( e. d2 r) K& E  q+ x5 H
        plt.show()* X8 t# V2 c3 q! N

    9 b, U1 z# j# f8 Y& T

    3 i5 z9 x/ J' {6 w& ?/ ~8 s3 C  i/ D& ?+ G+ I, v# f) H3 U& w# g- M# U

    4 V( @5 D* M% R; \with plt.xkcd():
    - u; L" Q! f; L/ a% L# {6 u    from string import ascii_letters
      R& Q' W" N0 ~% P( a  }5 \+ _2 [    plt.figure(dpi=150)4 H% w% ^- U( B# q3 O
        patches, texts, autotexts = plt.pie(' J' y  V0 f/ r% M1 Y$ ~& ~7 H
            x=range(1, 12),
    % c4 O% j; J% S2 S        labels=list(ascii_letters[26:])[0:11],
    , A, K' Z; _& n, n# Y4 }        colors=[
    4 O! M! k1 a$ F( p+ @- O            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',9 d3 k3 ^* c9 D
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    2 z/ ?+ F$ t: h/ ^/ m7 V( h- r# _        ],
    - v! a6 v* L1 @/ v/ C$ p, t5 b1 M        autopct='%.2f%%',
    : d/ _% ]( b1 q! T- K/ H6 J    )
      w+ P4 @7 ]& p" R    plt.legend(& {( x+ I. z2 X7 Q
            patches,
    % D* z0 `7 U7 }6 i6 O) ]5 P        list(ascii_letters[26:])[0:11],  #添加图例
    ) H, Y) v1 j, B" x        title="Pie Learning",0 |0 `) v' [! t0 T0 X
            loc="center left",
    * v% S& J% \: t+ h6 T+ J7 A        bbox_to_anchor=(1, 0, 0.5, 1),2 [) x/ }1 I; |  r
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    2 `7 R0 K2 p, z( a    )
    6 S3 p& j* I  o/ X) T/ o4 }# Z  l. z, f/ E* @+ A5 d4 \1 B  ~

    + ?; g3 c5 t. j- z. B/ }
    * C; t  j( y( y/ m

    8 n) p- \( ?$ p- |) C7 Z* Cimport matplotlib.pyplot as plt
    1 v1 ?6 O& U0 p+ I' O, Himport numpy as np8 T; |: C1 `2 f3 C( c1 ~
    with plt.xkcd():
    7 m1 ^- Y3 |; D; E3 b3 m, j' [    plt.figure(dpi=150)
    " u, v9 H( _) W! O/ ^2 `7 K& X$ @    labels = ['Jack', 'Rose', 'Jimmy']% z+ m1 B2 w2 i. `
        year_2019 = np.arange(1, 4)
    ) t/ a  I! V0 \! ?: U    year_2020 = np.arange(1, 4) + 1
      E8 \3 W9 e3 V; y  M& f    bar_width = 0.41 \( T: Y2 o3 P9 X
    5 G- P* z, b. z0 X
        plt.bar(- S# }! X7 C/ o( m* c
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽& R4 w$ `9 {3 J4 P( F
            year_2019,
    ) n( B  K! H. t  M: I) _/ W% ~7 {        color='#dc2624',
    " I$ Q  x+ x- E- ^9 M+ d        width=bar_width,3 m5 d1 E5 A2 A* _
            label='year_2019'  #图例
      b- y  b. n; F+ u- a    )  H  t5 N3 y; O! s) L% `; H
        plt.bar(
    : ]& N3 D  N) R3 R+ n% K        np.arange(len(labels)) + bar_width / 2,
    ; ]0 Y, F( B6 u! U3 d        year_2020,
    2 v; Y: Q+ O$ m0 a: _- i- `        color='#45a0a2',+ O/ I4 o& G: A. a+ |- ?& ~
            width=bar_width,# c7 P( o7 P# d: y! }# i) s$ J
            label='year_2020'  #图例! A3 H' r5 X5 j: G! H
        )
    ( x" N+ x3 p) d& ?! S% ~    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称, r% Y% w- z9 N% t, K- v
        plt.legend(loc=2)  #图例在左边: g$ j5 ~: V7 X/ z& r
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 * T6 |5 ?4 M0 S2 P+ F4 K
    2 U& [9 q' k9 |, b. w* I7 q+ K
    3 a' m* M3 x$ }6 ~4 C3 R$ D

      Q# I# v% G7 E$ C. e, m6 C4 K
    5 a: L$ Q( r2 F) |) G& |  z
    - }; ]9 w$ q4 m4 J' f0 ?

    5 Z3 w6 n5 y+ P9 o/ C3 \以下参考: Python可视化|matplotlib10-绘制散点图scatter9 N* g! d) \) {# x. d- d. O
    & {$ ^' O7 O, N/ S; T* l  @9 W6 Y$ G7 I
    $ d# \$ q. @" W  o% @  E
    import matplotlib.pyplot as plt
    . [" D) v: w9 H8 P  n. Jimport numpy as np
    " ]5 V  o7 O3 K% gimport pandas as pd! u" g3 t- T6 w! i% [) F  c( G" j
    from pandas import Series, DataFrame5 N0 ?, i1 @2 a0 u7 G' @! ]' W/ o
    #数据准备
    " O' H5 j! y. B, kfrom sklearn import datasets
    9 |9 D/ m9 c4 j" l* }- [  e 9 v8 e/ f, A4 Y# l! Y7 t' E
    iris = datasets.load_iris()
    " |9 z( j0 c0 j. a1 @! b4 Cx, y = iris.data, iris.target
    5 K2 @) a& {+ l# ?5 Z( @- xpd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
    , s& L5 t6 w. k5 u' @* j% p0 }                       columns=[0 Q9 O% c, e1 }# c9 |' _/ @
                               'sepal length(cm)', 'sepal width(cm)',
    0 \/ w) D3 R! q' n1 Z                           'petal length(cm)', 'petal width(cm)', 'class'
    + u8 l# O5 \: g                       ])
    # H' @, h0 E! N* j+ C6 w* U( Kwith plt.xkcd():
      w: V9 T# g$ ?+ ^7 u8 m; @) {" g $ D/ w4 Y* F' A7 H0 K0 j
        plt.figure(dpi=150)  #设置图的分辨率$ C: O8 V& [  m8 ?8 `, K( N
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    # B8 T: g- e1 z# s! q    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类, |( a8 C% i. `6 n* F  G# h" S
        iris_name = iris.target_names  #获取每一类的名称
    " B7 y$ E2 O" d( ?# B; U) {* H2 `1 W    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
    " `5 Z3 C" v7 o1 Q3 @/ H. O4 g    markers = ['$\clubsuit$', '.', '+']  #三种不同图形
    . o6 O: D" F+ s9 ?" O, P
    2 Q0 i' L$ Y& a' ~* f& E* s# C* U/ }    for i in range(len(iris_type)):
    # q! u. D6 u, f6 X/ f% u) f" w        plt.scatter(
    * y7 u/ l7 L9 }$ a            pd_iris.loc[pd_iris['class'] == iris_type,9 `9 i  F$ D% _
                            'sepal length(cm)'],  #传入数据x
    " y. W: S% u4 Q            pd_iris.loc[pd_iris['class'] == iris_type,
    , V0 L8 y2 Y& A9 @                        'sepal width(cm)'],  #传入数据y
    # m0 z' k% ?! I% V5 _            s=50,  #散点图形(marker)的大小
    6 z# Q* Z/ ~$ `) Q* Z            c=colors,  #marker颜色
    ' G  n+ l" z* `! c- X' \2 D5 e: P            marker=markers,  #marker形状% k- o$ V$ j# b- p) U
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充  w; R% j  ]6 T* D1 Q( S7 k, _
                alpha=0.8,  #marker透明度,范围为0-1
    . z6 N* I, @) g+ y/ z            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c. O" B8 |, O0 _5 _$ S8 q
                edgecolors='none',  #marker的边缘线色9 G, N  a- b5 f  U: n7 Y
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    ) t5 m% X1 N$ s' _4 u0 N* D            label=iris_name)  #后面图例的名称取自label
    $ l. D% ~# s" P0 }4 }/ c
    4 r! X5 A3 t" E" t8 w    plt.legend(loc='upper right')
    - d: f- _+ \( O/ @
    ! n& k9 `$ \3 a$ r

    & S3 X2 u) z/ P( O; l; F" E( j8 w————————————————' [, T' B; |% G! G: \5 Q! ~$ O& F2 [* h
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    6 s; q4 G1 O+ h( A- `2 u  C/ v: |原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753) Z+ `9 {1 Z9 c6 {" I
    ' Z, Y. _. x7 k5 w$ J2 W$ Y- l

    $ r6 k; G! M5 I; y4 e. L9 Z5 j0 T/ f
    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 11:24 , Processed in 0.318259 second(s), 51 queries .

    回顶部