QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6222|回复: 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
    ) F1 g* s7 m' u1 N
    一行Python代码有多强,可让图形秒变「手绘风」& B4 ~: q7 c4 D9 V8 I# _
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具  a* H0 p8 j* R, E
    ( D4 |/ t& p  h" H' M; a
    1 H) T# U+ V# H8 N
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。/ J. i( A) t" v5 E% C* \
    % ~! `) s2 k" @3 o; P

    " M  f- R" ?5 s' j. A4 amatplotlib.pyplot.xkcd()简介
    % ]& F: O% s$ F5 J- Z; ?/ }这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小5 d: e1 A" A/ E! v; M$ N+ R

    6 g' a1 j9 R/ U0 \- l
    / G0 Y/ W) R5 `+ L  L; H
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
    ) t# ^% T/ c8 ]3 s" I8 t                       length=100, #褶皱长度7 q, `/ ^8 \4 G! l
                           randomness=2#褶皱的随机性- a% a8 _, @9 T% _; h
                          )* E: c" M9 n, V# E* D
    matplotlib.pyplot.xkcd()使用) R+ M7 |! H- ~9 Q& b& g
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    6 Q; K. d) Q* S% H0 a) @# E( Z( w7 g

    ( e' v9 [1 N/ v4 f: `with plt.xkcd(scale=1, length=100, randomness=2):! y, h/ H+ b# Q. p; W  o
    #with是临时使用一下,不影响其它图使用正常样式7 `5 C) b9 \7 \! {5 e1 e
        绘图代码
    % x' U& Y4 q5 X! ^( |    。。。。。。& K: p5 G4 R4 P6 G! w' E- e
        plt.show()* S3 I: y( o# E# C: F+ Q, U$ q
    matplotlib.pyplot.xkcd()使用实例 - d) w" b$ U) M3 l
    下面代码为pythonic生物人公众号之前的文章代码. p. u  R1 F) j' \5 v$ @

    : r) H2 f% }; x

    / |$ B% {$ T. ~- F: Z' y8 j2 S& o以下参考:Python可视化25|seaborn绘制矩阵图
    7 ^$ H% V( c' c' J$ ^1 J% s- A. |' y% _- G$ \

    6 ~  r% X) m5 k6 k#支持seaborn+ O: d8 Y" S$ q* @7 Y
    import seaborn as sns
    . A3 T& L8 p$ j3 \+ F" d, qiris_sns = sns.load_dataset("iris")* M& D  S' i& @! q1 R2 H
    with plt.xkcd():: S1 C1 U9 f7 C2 g7 [- j- o
        g = sns.pairplot(
    9 [: E6 f5 r$ R( S        iris_sns,
    - ]) m2 J3 R, e, R        hue='species',  #按照三种花分类
    2 [6 o" M" n' d) v/ r0 h) Q* b, P        palette=['#dc2624', '#2b4750', '#45a0a2'])
    : v$ @$ j# w3 p5 g; @" S8 B6 Z    sns.set(style='whitegrid')
    7 W* L0 p  s$ Y6 ^$ S8 ^, M    g.fig.set_size_inches(12, 12)
    - d: m. U9 p! B8 R! h* h  c3 ]; H    sns.set(style='whitegrid', font_scale=1.5)) G8 I5 s4 v% |. U8 |5 ?
      # N9 u) Q! M4 z

    : ]# d1 d" n$ u1 p* c
    9 @- v; n# m, [# V7 ^
    以下参考:Python可视化29|matplotlib-饼图(pie) ! J, _& n, a4 ]

    : [+ ~; p+ H0 ^' U; B

    4 l" K3 G6 Q8 ~" ~6 F* S* Nimport matplotlib.pyplot as plt8 X# r. \# y- y4 f% X3 z5 K
    with plt.xkcd(4 U1 r3 z( u* o* r2 K& K
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度
    # o. V& P" n0 M        length=120,  #褶皱长度5 |5 ?, U3 a* r  H
            randomness=2):  #褶皱的随机性
    9 D8 _9 B; p7 x, ]: p. Z. b5 U5 M0 G( u    plt.figure(dpi=150)
    ; [! c# X! ]6 `- u& `) K    patches, texts, autotexts = plt.pie(
    % t+ y0 a- D/ C7 y/ j        x=[1, 2, 3],  #返回三个对象
    * h) C' R& H0 |- e$ ~9 p        labels=['A', 'B', 'C'],' e# y0 w1 ?. M+ U
            colors=['#dc2624', '#2b4750', '#45a0a2'],
      ]) B4 h! s/ U& O8 v. p        autopct='%.2f%%',
    / |. c  H+ m1 f8 T# M$ {+ w        explode=(0.1, 0, 0))6 K: p1 W" e! G* e
        texts[1].set_size('20')  #修改B的大小( J5 e& ?: v/ y. ]3 a

    9 u# g  _1 E* a" Q4 k    #matplotlib.patches.Wedge
    3 t7 G( V+ b8 @    patches[0].set_alpha(0.3)  #A组分设置透明度
    ( V: C- D/ x! q% l    patches[2].set_hatch('|')  #C组分添加网格线
    2 x* Z1 B4 c5 D. r2 y    patches[1].set_hatch('x')
    3 h3 |2 ~, [% x: H. U
    % S# }+ \( s, M, B    plt.legend(& [$ e/ g' J  M% i9 ~
            patches,
    4 _6 q" Q, B1 H1 ^        ['A', 'B', 'C'],  #添加图例9 x9 ~& d# B9 {% _; P$ T& a% g
            title="Pie Learning",0 V+ a* y7 N4 G& r
            loc="center left",
    4 [! T8 {+ D% s( V- e7 U        fontsize=15,
    * S0 G/ C2 g# w8 J        bbox_to_anchor=(1, 0, 0.5, 1))/ R6 {4 M/ r* l8 ~% H/ Z) D! [
    # V' q, O6 |2 ?$ C* S8 r/ \
        plt.title('Lovely pie', size=20)1 w; f) U* h: N/ y1 P: B
        plt.show()/ g, M2 W4 B9 L4 M6 ~% y& n9 C9 H
    9 h7 ?% h$ Z/ h6 b
      p7 z  v' ~8 \* N, _
    3 U5 h7 {6 G8 Y. m9 \0 q8 y

    ; T# E: H: N0 s1 H  @' Dwith plt.xkcd():* u9 o) a$ ?9 x3 F
        from string import ascii_letters
    . V- m4 x1 X' Z+ o0 A1 m# u/ Z    plt.figure(dpi=150)5 {* F- u7 @1 u. P$ k0 O
        patches, texts, autotexts = plt.pie(1 r: d$ }* @( p2 n0 c9 ]: \7 H
            x=range(1, 12),9 b, o# u# U! b+ N4 S
            labels=list(ascii_letters[26:])[0:11],' U2 N9 m9 c9 C0 K
            colors=[$ m5 x7 T/ ^! b1 \
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',! f" I0 Q/ H" v4 T, H4 R
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    & [* {$ y! Q8 Q8 R$ p# D. f        ],! |, i: w: K: \) V5 d, K
            autopct='%.2f%%',
    6 r/ a/ m4 y4 x# W6 A# t# l, A/ o    )
    1 X2 b  P. k0 Q! K1 t    plt.legend(& m! ?- d1 C2 R2 s8 \
            patches,
    % n5 [9 X, ]0 f  l        list(ascii_letters[26:])[0:11],  #添加图例
    4 V7 B! m! m  W6 z        title="Pie Learning",
    , i1 }* @5 `& c4 N( {9 @# C' ~( L        loc="center left",
    / t: v- s: o( T/ x# }* Q        bbox_to_anchor=(1, 0, 0.5, 1),$ |- q' ?) u0 ?. b& L& R9 A
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    1 i4 _. A& r4 k; q( q    )# J& k! r8 b9 r  W5 K

    ( I) s. u8 {6 r5 R

    ( a% Z; u! Z; G5 n! |8 p! }1 G% {% X; ^) a  d' a
    7 }& |0 _" j5 R: D% E
    import matplotlib.pyplot as plt/ E- b/ p6 ]+ L
    import numpy as np
    6 T% I8 b1 z2 s, T6 y0 Lwith plt.xkcd():
    ( g& |% T) A9 k# b; w* [    plt.figure(dpi=150)9 S: x' F, ]* O; G8 l
        labels = ['Jack', 'Rose', 'Jimmy']
    + ?, y, e3 M( B, D    year_2019 = np.arange(1, 4)% A9 R* S' |) l$ i0 r
        year_2020 = np.arange(1, 4) + 16 ?2 ^' H, m7 b1 E$ D1 w" }* h/ H
        bar_width = 0.45 c* ^& ~" G- {5 I0 l# ^

    9 ?4 P& e9 ~) L: K+ [) }    plt.bar(' d, V! c5 H; {3 ~
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    . n% w7 X: u  |  o        year_2019,
    5 M7 \9 {- n2 W. _, P        color='#dc2624',
    & @) r$ ~0 f& j$ [: U        width=bar_width,+ [7 `/ ]9 P7 b- Y  u) }" m" P
            label='year_2019'  #图例. X- Y# c" {3 `( S. |! Z4 ?
        )  e4 i# a+ d6 Z8 w' ^
        plt.bar(
      \) I0 }, B9 Y, e8 g) e        np.arange(len(labels)) + bar_width / 2,& \+ A% D7 ^2 ?8 @" t
            year_2020,, Y7 n+ x+ @9 V3 ^' n# v% y
            color='#45a0a2',7 }8 j' b/ p( H* E6 h' e
            width=bar_width,
    8 D/ `! G5 K; B) ~0 _        label='year_2020'  #图例" M! y- C4 p" R( e1 D- T
        )
    ( S( _4 P. g3 I2 C$ e8 e% d    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称
    2 r) \4 _0 J& P9 ?1 a) I3 m/ D    plt.legend(loc=2)  #图例在左边: [2 w4 N* Y6 t: }# d. x6 I) S
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
    0 `/ I  w  K8 u3 Z  Z2 G9 m7 Z( ]( y' J. q; I2 x% N7 Q5 e1 m4 Z
    % q" z' T/ H9 e

    $ c1 ?! b5 S0 f0 g7 `* n) E% R

    1 y9 M  k, M, B2 R$ p" I
    + \7 g" B# s$ W0 ]9 G
    : l2 @. [/ h# j) n2 q$ b9 ^) l2 z
    以下参考: Python可视化|matplotlib10-绘制散点图scatter/ f5 R, W6 s0 a$ r1 _

    + U" ~! o0 w; j+ D6 }9 O3 l, Y
    7 J9 x( Y) v* {8 S  [
    import matplotlib.pyplot as plt
    # j/ n5 O& i) }  p7 Ximport numpy as np8 R1 r! a; e! A; u, T3 }
    import pandas as pd: I. L/ O/ z$ ^# t
    from pandas import Series, DataFrame
    % r1 @# S9 j& z, _( n5 o#数据准备
    ; r( A( z* t+ o% sfrom sklearn import datasets3 ~, X5 X7 X, K5 |) L3 t

    - a% l/ b( q2 j9 p; w# }/ Firis = datasets.load_iris()
    ; v2 H) t5 |: w/ v7 c( \, a4 px, y = iris.data, iris.target% l6 G4 u+ d0 j" ~1 B& F' w
    pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
    7 Z: w8 i. _: Z( i                       columns=[" W6 J- w% B- E' y
                               'sepal length(cm)', 'sepal width(cm)',
    - f- S3 T' Y7 k* L. I5 r  `                           'petal length(cm)', 'petal width(cm)', 'class'5 v' l; U+ f, n6 o* U5 a7 l
                           ])
    , S. g% t, c7 m: D; H2 C/ t9 Swith plt.xkcd():
    7 z' p& ~5 i5 v) `* o' A+ u # I+ H( t# }$ y; p& i
        plt.figure(dpi=150)  #设置图的分辨率5 ^9 y# z' C* i" n. {
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图) m. h0 B- }9 w9 T( W; j' D1 A
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类, u6 d6 L7 t( J8 k- D0 @
        iris_name = iris.target_names  #获取每一类的名称
    ; `9 b0 o  Y5 S" s    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
    6 C3 `1 E7 O) r0 c) |6 o. N    markers = ['$\clubsuit$', '.', '+']  #三种不同图形
    % ^: w, g5 j9 `
    . T9 K$ j2 U' c9 j& \: ~    for i in range(len(iris_type)):$ e- Y( C( [4 K/ h) _2 y& U
            plt.scatter(' Q% x( [$ y' s, q1 p+ L
                pd_iris.loc[pd_iris['class'] == iris_type,8 f: \! C) e% V
                            'sepal length(cm)'],  #传入数据x
    " l. U) i& m3 c' S/ B, c% R" Q            pd_iris.loc[pd_iris['class'] == iris_type,
    % p9 q$ h' M4 ^; N" r                        'sepal width(cm)'],  #传入数据y7 U5 s- ]. Q0 g" f. W1 G
                s=50,  #散点图形(marker)的大小
      E) Z' r: ?8 m& e% {: p            c=colors,  #marker颜色
    1 B# @! S$ L; z            marker=markers,  #marker形状7 B6 D, T. r8 {9 a, C
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    ; ]0 m# X9 ~3 e  P& C; A8 R- b            alpha=0.8,  #marker透明度,范围为0-1' Z$ ?9 i* e% @9 I6 C6 u+ e
                facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c; ]/ r( ^% }1 F8 X. h- r
                edgecolors='none',  #marker的边缘线色
    - d/ z5 X7 X+ B9 G3 R7 F! ]            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用- V+ t( y4 T; D' B2 A* Y2 x1 m
                label=iris_name)  #后面图例的名称取自label
    9 J$ o' V! s% ?% O% ^& m2 R
    5 S/ l# a  O" p& @: i- z# j8 J    plt.legend(loc='upper right')
      A% V; `9 e8 h4 ]/ P$ V- O( J! N: `; w' U

    % Z8 Z+ B/ a! [, q3 K  |————————————————
    $ p0 S" N+ e; L: z" @版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# Y0 X' \& w8 v, p! F, k+ o( Z2 [
    原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753( F; Q8 o- D) y/ R/ R' w

    ; ?& l6 x  D1 w: a4 q6 _4 {* l( `5 ^$ m: O! T
    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-18 22:50 , Processed in 0.387011 second(s), 51 queries .

    回顶部