QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6291|回复: 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

    6 R7 G1 {. Q& q4 A3 w一行Python代码有多强,可让图形秒变「手绘风」* _; B7 P  y0 {+ O# ~& e' l
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    4 b+ z  s7 l0 k$ t) M: h  T. ?$ N; W+ D- s" R& _, ]) L5 Q7 d9 `% e

    3 W1 v' m9 F. \5 w9 u, a7 F但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    ! m3 v4 C$ [' |0 t; K' _- p% y- J# A  v

    ) t! h  L! h( ?& u/ g3 bmatplotlib.pyplot.xkcd()简介- y" [; `4 b2 F4 d& n
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    % F+ L: U( G, R, S' w3 I3 d, E
    " J+ t' G* c8 g. i
    6 a/ S: A, E5 j  k
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
    2 Q& ^, P% R) K% W1 i- K                       length=100, #褶皱长度
    * n; b6 w3 e# }1 o+ K8 P. e                       randomness=2#褶皱的随机性
    . g) w; l1 \% D  j, b                      )  v0 n6 `' c# \: E7 l& f1 r
    matplotlib.pyplot.xkcd()使用
    * p: C3 ~2 C  `6 q4 [& _2 S+ V5 B) u如下,加with行代码即可,括号中参数按个人喜好决定是否设置~' q  M% ?5 i: y
    6 ?' ]: B0 C/ p  ~" o/ w

    : C0 o* x6 [& v% I$ Awith plt.xkcd(scale=1, length=100, randomness=2):. r% t% C" p; h
    #with是临时使用一下,不影响其它图使用正常样式3 i6 ]: k4 ~& M6 E
        绘图代码" d$ \+ b; O+ C# n
        。。。。。。
    0 X! ~8 t! k3 L9 N9 R" J% C    plt.show()
    . y6 L, `4 M. A6 I( tmatplotlib.pyplot.xkcd()使用实例
    # s# K  `6 z$ ~! v6 m3 k& |+ @下面代码为pythonic生物人公众号之前的文章代码
    ' y% c! `$ {2 M+ d0 ^0 H* [) z0 A  B2 @) B8 f3 |9 ]
    9 A; p3 ?& E; v0 R! x
    以下参考:Python可视化25|seaborn绘制矩阵图/ ]2 {' @" G% j0 A0 S. B! J2 E& x
    ( x3 B6 w: w' u! [8 O' t7 @

    ( _, u/ h3 j2 F. `2 V! I- {7 N3 M# C) [#支持seaborn+ v# H+ [! z& D. v# k: s3 q
    import seaborn as sns+ P5 m. v" m  p/ W
    iris_sns = sns.load_dataset("iris")9 V; ~1 {4 y8 s' U: E2 ~. O
    with plt.xkcd():! ]6 N7 c+ Y& i& X# E  J% O
        g = sns.pairplot(- h0 K' }& v! m% Y; h; ^4 Z
            iris_sns,% ~9 J8 T0 U& U3 N
            hue='species',  #按照三种花分类
    * @+ h5 T& g' u/ b; l; u: F        palette=['#dc2624', '#2b4750', '#45a0a2'])
    8 a* ^# f  r6 b9 W' q    sns.set(style='whitegrid')
    ! n) }' P& L" G1 N8 a7 X    g.fig.set_size_inches(12, 12)5 X0 \0 q' ~' ~/ [% c  `- c4 m. v
        sns.set(style='whitegrid', font_scale=1.5)
    8 L, w( J# r& `  ( Y/ G7 c6 S1 |6 l5 Y! x

      |. d5 k, b2 b* n

    2 c3 s# @& y0 X# I以下参考:Python可视化29|matplotlib-饼图(pie) & G" H3 p) E* ^  z* K

    8 N, Y7 y3 k3 ~

      K3 p# e* S  v5 o: g+ h3 O5 i; h. pimport matplotlib.pyplot as plt
    $ k; ~& T) j3 m) p. Owith plt.xkcd(
    2 M8 r9 _9 ?1 k4 m' O        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度+ W, G7 \: j& q9 i" e, k
            length=120,  #褶皱长度
    % y  Y; q: ^6 Q0 Y9 W4 r        randomness=2):  #褶皱的随机性1 s- N$ G2 f3 |" ^
        plt.figure(dpi=150)
    , I2 A. R4 f7 [# D- g& a% c    patches, texts, autotexts = plt.pie(& d( @) K' X7 L6 l
            x=[1, 2, 3],  #返回三个对象& a6 S4 T9 `0 G
            labels=['A', 'B', 'C'],
    . x: O1 [4 i# A: \# d" S        colors=['#dc2624', '#2b4750', '#45a0a2'],; I; Q5 B: U# W6 q
            autopct='%.2f%%',5 Q& n0 H. T' x
            explode=(0.1, 0, 0))0 U$ n, w3 ~& `& ]
        texts[1].set_size('20')  #修改B的大小) h/ l6 n" f/ p: R( J9 i

    " d: N4 w, g! c; o    #matplotlib.patches.Wedge
    6 b6 I+ N1 }, G1 t) |0 e( |    patches[0].set_alpha(0.3)  #A组分设置透明度6 _1 ^" s: x7 o* ^7 Z( q5 Y
        patches[2].set_hatch('|')  #C组分添加网格线8 M  l+ y: F, M# d' R- y
        patches[1].set_hatch('x')& W' d1 g4 O" `

    - T* _& V% }3 [' w# P  H4 c; C  A    plt.legend(
    $ u- t* V. l% \& R        patches,9 {9 F- u# V" A3 Z( d9 i( I2 O
            ['A', 'B', 'C'],  #添加图例
    * I8 v6 N+ F1 r; _        title="Pie Learning",% [0 Q; `: N9 \; p
            loc="center left",7 q/ c+ }) P7 v) [! W' X
            fontsize=15,
    * e! p5 v6 P/ t2 X        bbox_to_anchor=(1, 0, 0.5, 1)): f/ r3 d! c; z) _# w5 J
    0 |; N( f8 F$ _4 R2 L  o# k
        plt.title('Lovely pie', size=20)' Q0 V+ l: M; Q  s4 ?# O0 l
        plt.show()
    , R8 b- V2 U# H$ o
    * L" K2 W. ?3 U' E  D3 s) P$ T
    4 V0 ?$ T- O  U. H% _+ w# N
    9 w' A3 k7 Q5 y7 s3 J

    ( W$ P; y. \2 nwith plt.xkcd():2 F' K( W0 W- D) X
        from string import ascii_letters
    0 O* r4 B; b0 P+ r5 x) L    plt.figure(dpi=150)
    ! j5 a- ~3 @0 O  h& L% |6 y    patches, texts, autotexts = plt.pie(
    7 c! c3 y! K% `( t+ t        x=range(1, 12),
      f4 D+ s1 A+ r8 n) Z+ u$ ^1 U        labels=list(ascii_letters[26:])[0:11],
    ) s& |0 B3 m# |* ?1 ?3 I6 y        colors=[/ r$ v7 y' F0 L& S  z0 P
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',( h$ n$ {# N% U5 h( D
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'+ j7 {5 T! w" @5 u, q( E
            ],& u, C1 m3 F0 s6 z" U5 w
            autopct='%.2f%%',
    & Z- Z# n9 d, _& n6 {0 W8 {    )$ G2 g4 a- j+ |6 E! u3 J
        plt.legend(
    7 ~* J( c% Q1 B) o( b. f. ]        patches,! ~. W. ?1 N- K0 o- M1 s
            list(ascii_letters[26:])[0:11],  #添加图例
    6 F8 x; e$ j, F0 _        title="Pie Learning",5 y7 r- V2 P4 A4 b8 C* v
            loc="center left",/ B4 r# @  S& o" `/ J
            bbox_to_anchor=(1, 0, 0.5, 1),& f) J8 J/ T( Z9 a
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,) l  \8 H) H: {- g
        )
    ; I9 {7 D# ~2 ]+ ^# U; f" N
    : {4 Q0 \, `" i2 r3 O/ s0 b  y

    8 K' U/ s& q( C- o8 |5 ^4 P+ a) e% T* }7 P$ c1 i, _

    6 ^, B, _% i  pimport matplotlib.pyplot as plt6 m' P! N, i" v2 z
    import numpy as np* Y8 u- U6 _6 j5 X7 A) T1 x
    with plt.xkcd():
      ?; U& d0 |8 Y+ l- z& H& U4 z    plt.figure(dpi=150)! x0 Q( ?' Z2 E' L3 a$ {; Q
        labels = ['Jack', 'Rose', 'Jimmy']) a, e8 n! S7 w' O; Z7 c
        year_2019 = np.arange(1, 4)
    / |; K/ E6 Y) Y! @: f    year_2020 = np.arange(1, 4) + 1
    + h8 _& R6 V3 M6 O    bar_width = 0.4
    + H6 q" K( T: z. [4 i ! X$ ~* g: h4 `% r+ K( Q5 t7 _
        plt.bar(1 }8 A5 [  v4 z( \; D
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    , |# o( q- a5 f        year_2019,4 `, v$ M# B* E( J
            color='#dc2624',& n' t' ]" d+ I0 G3 i& E/ v
            width=bar_width,
    6 `* Z: k, S$ h1 L4 R        label='year_2019'  #图例
    / c4 l# B* M- u! C    )/ U0 c8 b5 ~# x+ I& c) `! r
        plt.bar(1 c8 M: ]% h2 l3 G; U
            np.arange(len(labels)) + bar_width / 2,
    6 u3 z- H0 R* j5 C) L6 O* G, V: y        year_2020,) y1 U# B; _0 R2 |8 m+ w
            color='#45a0a2',4 {' n- X* N2 H0 n
            width=bar_width,( t2 L4 C  J, {, F: j  e
            label='year_2020'  #图例$ j& }8 A* j$ P+ Y! \. ^/ G' }9 B
        )' L) s; P1 W4 f1 L: B
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称! o3 M9 H. I9 ~/ j) _
        plt.legend(loc=2)  #图例在左边$ a5 ], G  c# h8 b7 k
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 ! L( Q9 y: p8 l) t5 f; a
    8 f, {4 h9 A3 G; f
    5 {" b; k- c/ W" A. z- {% n8 e
    " h: m" D4 y5 \
    0 Q3 n6 F) u/ [, L5 ]
    : X: q1 v" u! `, J) }- |

    8 l  w: n& Q( M以下参考: Python可视化|matplotlib10-绘制散点图scatter3 h% ?, I6 d' e7 S6 l/ I* w
    : I& l$ `* ?' u. B2 T8 k/ _
    9 I5 {1 Y" s4 K* j! n. I. ~/ L+ [
    import matplotlib.pyplot as plt+ |- B  A7 T# `# k6 a  ^% S
    import numpy as np
    3 j% R2 h* N% Q# C5 i8 Nimport pandas as pd
    9 g* M: A( y- c' O3 z0 u4 }from pandas import Series, DataFrame
    " f2 w. b1 ~, U& N, _( \$ W#数据准备
    ( [3 s: i2 d* L/ k$ H( j. Ufrom sklearn import datasets2 |% l  q8 s: V, Z
    7 L5 D" @" w  y2 \( N+ Q
    iris = datasets.load_iris()4 ?$ k1 Y5 T5 e5 U* ^
    x, y = iris.data, iris.target
    ! ]% Z8 ?9 d) B+ O- C+ ppd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),+ _1 e5 o7 u2 j) v
                           columns=[7 |- j2 o+ @9 v9 v7 C6 h' |
                               'sepal length(cm)', 'sepal width(cm)',
    0 w4 O, i- M5 V' d- ~. b) M% B                           'petal length(cm)', 'petal width(cm)', 'class'7 J) v( d% `. h" ~5 u+ Z, d
                           ])
    8 E' _. S+ j. W$ K& v$ kwith plt.xkcd():
    % K5 h" V" d) e& w. f
    0 d2 \  E, E& I2 s1 [5 }& E    plt.figure(dpi=150)  #设置图的分辨率
      b0 y+ q6 U$ C7 O    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图9 i, X; r( q/ b5 @. F; e- K
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
    2 Y& v2 H0 u  W% Z; E    iris_name = iris.target_names  #获取每一类的名称
    + w' ~: R; Z" ^, ]( t    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
    + e1 A8 W  J" M  G    markers = ['$\clubsuit$', '.', '+']  #三种不同图形$ S# }7 `" J, f9 l3 {+ ]

    ' `3 Z) I* I- e; u+ p: V" @    for i in range(len(iris_type)):
    7 _, ?$ f; u' H4 |: Y        plt.scatter(
    9 E  ~3 ?( F/ C            pd_iris.loc[pd_iris['class'] == iris_type,
    9 T1 ~5 V' H( b2 r/ ^2 i                        'sepal length(cm)'],  #传入数据x. ?3 c1 k% ^' P, I( F
                pd_iris.loc[pd_iris['class'] == iris_type,
    / L2 L/ [) F; J/ h. {                        'sepal width(cm)'],  #传入数据y3 @% \; i9 \  \+ `# ?7 ~
                s=50,  #散点图形(marker)的大小5 m& A* A# ?% G" p; K
                c=colors,  #marker颜色
    , W7 I- F& F8 ?& c6 C; n            marker=markers,  #marker形状
    ! o/ K# j) Z; `            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    0 a9 K0 V: _/ d. m            alpha=0.8,  #marker透明度,范围为0-1
    ) o  b- X  Z; G' \# }            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    2 _' O& O- [% h$ _            edgecolors='none',  #marker的边缘线色
    ( }# Q$ t2 Y4 O( B/ ?- R            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    * j& o& I3 R5 w, s            label=iris_name)  #后面图例的名称取自label
    , i7 P* f/ c- P$ n: g) O3 i$ B& { 6 B/ h) X! h4 V: S' s# t3 Z
        plt.legend(loc='upper right'). P4 @, {6 Y1 `6 U! [6 j/ Z

      |8 t) s* f1 ~% Y# d& u, n
    & x! B) N% e5 f9 Y$ F
    ————————————————# r+ i4 I1 g$ _0 L0 X" e& v9 W2 J
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    3 ]% t! o+ E; G' _  B9 Q原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753: z8 P$ Z" `' n5 P4 ^. ~  K

      ^7 g# T9 \2 S$ b) a; S0 a  L% V* E. g
    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-9-2 23:25 , Processed in 0.393134 second(s), 51 queries .

    回顶部