QQ登录

只需要一步,快速开始

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

    " G) c* H1 g: V, T6 J. G% n: T' K+ f9 L: k一行Python代码有多强,可让图形秒变「手绘风」
    - Z1 s$ s3 [0 y) U之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    ( v7 p6 ^0 p* o, k
    4 j4 U: t+ w5 y7 D! r; G- M/ J+ s6 N
    0 t* j3 i6 E9 W* I
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。# }1 o( |3 S+ V8 L, t
    2 m& D% \6 \, d0 I* A: e7 o
    1 J1 z) N7 s, q8 T) R- Q4 H1 I, X
    matplotlib.pyplot.xkcd()简介) K1 M% F$ Y# J: C$ y: A. _& U, w6 Z3 h  @
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    ) p4 ^! q0 W" Z: ]6 @  d, I
    2 v) g/ n6 l! I
    & r- l, |' D7 z" P
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度* s1 B/ j" I8 D+ J+ R- a! G
                           length=100, #褶皱长度  p- [- Q8 B% B  G
                           randomness=2#褶皱的随机性
    & {. l$ R; u1 P+ z$ S  {8 O                      ), ?( c# h$ u/ R4 V& s( r1 f; a, m) B
    matplotlib.pyplot.xkcd()使用
    2 j0 `5 [7 [" z2 Q% R1 h如下,加with行代码即可,括号中参数按个人喜好决定是否设置~( E' n, B/ ^. O, D
    3 K) z: a/ ]% R* A! H! D: V' u

    ' H  A6 j  ]8 E4 G' M  Swith plt.xkcd(scale=1, length=100, randomness=2):
      g. k  m% R1 y4 x! H5 Y) f" m#with是临时使用一下,不影响其它图使用正常样式
    % b2 U( d1 e' c7 o. w6 u4 Y    绘图代码
    / |6 Z& r0 S6 b! ?. ~$ u* Z" R' Y" f    。。。。。。, q8 \# t  _( t7 W1 g. Y
        plt.show()3 z0 g7 r' |) o1 q/ G, Y3 h( o
    matplotlib.pyplot.xkcd()使用实例   y  K# `" w: E4 f0 B% H' [
    下面代码为pythonic生物人公众号之前的文章代码0 _" u( M5 w2 x3 V7 t3 [
    - R5 w. O- o/ O
    2 S! R+ |$ Y9 D
    以下参考:Python可视化25|seaborn绘制矩阵图! l$ Z8 F7 o2 p7 l9 ]1 q/ \/ c

    & J6 X9 Y; h$ t( H* v' I; w1 p

    4 o3 X2 L! d& P/ V: v  x#支持seaborn3 M6 l# _) u+ T5 R9 d8 P
    import seaborn as sns5 u, R7 K2 I3 T5 ~; {8 e
    iris_sns = sns.load_dataset("iris")
    % b( \, W. Q% B! r* c1 E" @- s8 Ywith plt.xkcd():
    9 X" `4 f% V: c( S0 {    g = sns.pairplot(0 t0 U6 G; y9 M! l( Q& \
            iris_sns,2 Q8 P1 a4 M1 b( O; I& X8 V5 i
            hue='species',  #按照三种花分类
    * `. y/ l- `4 v$ p* L( e3 H" u        palette=['#dc2624', '#2b4750', '#45a0a2'])& s2 G0 e& ]- U  S& H4 _2 c
        sns.set(style='whitegrid')
    3 X4 @& J" }0 x0 l    g.fig.set_size_inches(12, 12)$ K; y! x: N. \$ l( r0 X! T
        sns.set(style='whitegrid', font_scale=1.5)) i- G' }! e" H& D0 ~& u  r; t- P: _
      
    , X7 r$ q7 t0 l* l- V. [) n- w) Y5 A; `# C
    ; m, a" G" R* o% I
    以下参考:Python可视化29|matplotlib-饼图(pie)
    1 L# z" e: |$ s' ~& I( U4 o% @1 R: X! z8 q1 F4 J# Q
    8 e+ _3 f2 L) o
    import matplotlib.pyplot as plt
    # F" O! x. H) n  W3 X( i5 z/ vwith plt.xkcd(, W1 E5 |! u, o- b; {7 ]5 s4 B8 i
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度
    % L% b- Q" [' H6 S( p# v# G- R, ?        length=120,  #褶皱长度
    ' `- E- l, M4 @" X) p! f        randomness=2):  #褶皱的随机性
    + N7 ^( m  N# Z    plt.figure(dpi=150)4 m' Q- y5 i# ?$ D
        patches, texts, autotexts = plt.pie(: N$ ?1 [, y4 s0 t! Q8 p' u0 \
            x=[1, 2, 3],  #返回三个对象2 P5 G- D( T  k7 m* v9 q/ z/ S# A8 I6 N
            labels=['A', 'B', 'C'],! ^3 r; S3 K% L) t/ F
            colors=['#dc2624', '#2b4750', '#45a0a2'],
    & I) _" `# Y( X        autopct='%.2f%%',+ ~- a# H& m  j; X) W! s
            explode=(0.1, 0, 0)): U+ Q) [$ `& j7 v9 E8 Z# R
        texts[1].set_size('20')  #修改B的大小- Z) V1 S0 S* |5 Z' E3 v/ `* u
    9 H/ Q; x! D1 Z6 d6 y! ]/ b
        #matplotlib.patches.Wedge
    * C! s& ?3 G+ d: A4 v    patches[0].set_alpha(0.3)  #A组分设置透明度, ~' @1 s! B  m/ ^. u' T: ^6 J
        patches[2].set_hatch('|')  #C组分添加网格线
    8 n* ~+ j# T6 t6 P5 k% ?; Z: m2 X0 E    patches[1].set_hatch('x')+ w$ @# {5 g! h& h
    - a' c3 N  ?8 A  [5 E) L* e
        plt.legend(8 Z7 l; q9 Q0 H9 j) ^; V7 B
            patches,: D  ?9 p  N& a% x  _1 o6 }- m
            ['A', 'B', 'C'],  #添加图例
    2 M7 r2 p' |+ _5 I& f- x4 d- _3 a        title="Pie Learning",4 v& v( k4 w* W6 [; b
            loc="center left",4 P) n/ U+ d: F' n, i8 x2 U
            fontsize=15,7 e2 r% A% y% o# h7 h4 U
            bbox_to_anchor=(1, 0, 0.5, 1))! c1 X: F" ?9 t5 C7 M8 m6 R- @% V

    : K, n8 R; W( {    plt.title('Lovely pie', size=20)
    + n& _- `8 M5 p# m    plt.show()
    ; X) M2 Z! p% R0 Z0 S' I) E+ o# Q' ]- R* L/ H

    ( Q. o  S  G* r) a
    ! G. x  m* n, Z1 Z% p% E2 o; ?

    7 ~6 s( `( c# X2 Lwith plt.xkcd():( r$ V- U7 |1 L9 o$ r% |
        from string import ascii_letters" {, }5 W  b$ q
        plt.figure(dpi=150)
    : z$ L- d4 Z  ^    patches, texts, autotexts = plt.pie(' t( N" e0 L3 v  [# u: [
            x=range(1, 12),2 `* m3 N& B3 Q) N: a( f5 d
            labels=list(ascii_letters[26:])[0:11],
    0 n; t0 c; R( {0 P0 x  e5 J        colors=[
    % O5 `) j" V/ y/ h) w$ E/ e            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',& r5 Q1 {) ~) J
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'( l* I1 e4 f' p: A- d
            ],! _( @2 z! P4 m- e
            autopct='%.2f%%',
    ! D; f: O# u5 |    )) k4 A1 H" M0 Z) J/ r
        plt.legend(
    7 F+ J1 C3 a' o. m, J: V0 C        patches,
    , a; i" ^5 ^8 s  V) F% M* ?        list(ascii_letters[26:])[0:11],  #添加图例
    5 w* m% F5 o! \2 z        title="Pie Learning",
    8 E) t- z; T( u        loc="center left",
    % _) ]$ r  \7 h# k! n        bbox_to_anchor=(1, 0, 0.5, 1),
    " o; v  z* {, Q        ncol=2,  #控制图例中按照两列显示,默认为一列显示,' l" }- P/ h  M5 x5 i
        )* e+ Y# m5 ~% @- ~( x$ }
    * h8 {- ?' t! D: w) W
    % u) _7 d3 H6 u9 n) x5 r) o
    5 L- s% {" ?: u& ?% E/ D+ P
    / _- G) l' s. B- ]: f  Y
    import matplotlib.pyplot as plt3 l. v4 b$ g7 z* c5 Z! l8 I
    import numpy as np# Q7 t! [% S; G8 U  A5 Q
    with plt.xkcd():( L. h! m* o. m; f
        plt.figure(dpi=150)2 I. c& K) P# b, E& B
        labels = ['Jack', 'Rose', 'Jimmy']+ x8 m5 q5 h6 E* P; p! I
        year_2019 = np.arange(1, 4)
      c' O% t8 L( J    year_2020 = np.arange(1, 4) + 1. B  {" R" y, N( K! j
        bar_width = 0.4
    + P% b8 Y* P6 Y3 e( M  U ) X0 ^) o) F& n. \5 ]% g# A
        plt.bar(9 F. V- z/ q1 S4 T
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽7 V5 r" g! }) W* }: U+ l  b2 }
            year_2019,
    4 a; U& X* l4 W- T& j) Y# e        color='#dc2624',
    * b1 x3 c8 h' B4 }# h) [        width=bar_width,7 k& \* p* F: a
            label='year_2019'  #图例& S( i0 K+ V; r
        )* i& l6 R5 C! F" [1 _% f/ B- u
        plt.bar(% V+ g; y6 I2 F
            np.arange(len(labels)) + bar_width / 2,
    % h% {7 r; P+ `7 R        year_2020,
      I) n' @$ v2 i3 ~  C$ x; P( l        color='#45a0a2',2 [9 B! _: e3 Z6 r4 N
            width=bar_width,
    # ^( Z$ u: [) ?  q( `        label='year_2020'  #图例
    7 X3 \" H* a% u* `; }( z    )( L4 w& {0 o. Q7 R
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称
    , w2 y- p2 N+ a9 w$ F    plt.legend(loc=2)  #图例在左边
    4 \7 ]% I+ k3 p. G1 }' B以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
    2 J1 [) q0 \# O$ S% M% C- |  i: J/ L& J8 k' Y: S4 M6 h, J
    4 J: h3 }9 e: z3 T  Z% y# N
    , Q; O! r7 K1 `3 Z0 u; F

    , Z. p# P9 [% i6 }8 ~0 k# u" Z- p0 k/ F+ p( C
    : x) T  j! E- Y
    以下参考: Python可视化|matplotlib10-绘制散点图scatter
    5 b9 x: ^2 G/ g( Q; ~
    ; |9 f' G2 o3 Y0 t
    ( d2 m; k2 x+ l5 M6 v% z0 r
    import matplotlib.pyplot as plt/ m. v, m3 Q- B
    import numpy as np+ }, A: o+ y  S; w" G+ Y. E9 T* h
    import pandas as pd
    " ?3 T( e1 |0 t/ ]1 N/ ~4 \9 rfrom pandas import Series, DataFrame
    % p% t4 ]+ S8 R# ?/ u#数据准备
    ' D* x' T' q1 @! M0 i! qfrom sklearn import datasets
    * t+ ]  |; s# Y% ` 1 V* N7 j1 T" s3 n+ Y4 t9 x! C7 b! ?5 s
    iris = datasets.load_iris()
    % J4 [8 T! L) E3 R: t& i# \x, y = iris.data, iris.target
    4 @; w0 p8 G/ ?: ^) l! Ipd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
    & P, Y3 r2 l& s* H                       columns=[
    6 C: G& u: V0 Q/ N7 I                           'sepal length(cm)', 'sepal width(cm)',# W3 n! ]4 N1 ~! ~! Y) [* S; f6 {7 P% ?! o
                               'petal length(cm)', 'petal width(cm)', 'class'
    5 X' D7 V  I, o) e                       ]): R4 G0 O9 `/ ~- q8 \# H$ H; r
    with plt.xkcd():
    3 S- T4 |8 b9 h3 c- z
    3 d( o' ^2 I" O9 c* D    plt.figure(dpi=150)  #设置图的分辨率9 Z* X& N: d# P- ~
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    4 b2 a, B4 z/ n0 h: e    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类# f. y/ W" ^2 g& L$ W8 s
        iris_name = iris.target_names  #获取每一类的名称- z$ `- P- s9 I# k* z- r* |" M1 M5 V
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色2 U; ~9 H6 ~1 d4 o
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形2 ~! o8 ^; {# C  e" d, ~  \" y+ q
    ' K) w: h- |# O0 c) W
        for i in range(len(iris_type)):3 j- ?2 V4 t! g7 }
            plt.scatter(; u2 r) i0 X3 j% ^
                pd_iris.loc[pd_iris['class'] == iris_type,/ s" j. C+ ~$ [
                            'sepal length(cm)'],  #传入数据x
    ' |9 i2 o/ l# J4 f) s            pd_iris.loc[pd_iris['class'] == iris_type,
    1 ^) K, O1 I& O                        'sepal width(cm)'],  #传入数据y
    ; M" ^8 k( s" I9 a4 y* {2 ~            s=50,  #散点图形(marker)的大小8 W" I: ]1 L% {, j9 n% |. L
                c=colors,  #marker颜色
    + y4 i* f# ~) t& V) y) u            marker=markers,  #marker形状7 B3 G  ~4 [' c; M2 \2 ?1 {
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    $ g0 D# S8 o+ r  V' |            alpha=0.8,  #marker透明度,范围为0-1
    2 e! g4 c2 k. U* ?7 A" m            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c. \, s6 `, W& o9 |& U( p
                edgecolors='none',  #marker的边缘线色' E+ l, E2 w' O4 \" C* v" o6 w$ }' h
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    # a( T, o4 _/ s: @: w5 s            label=iris_name)  #后面图例的名称取自label9 |: m9 d; [% f$ X* r5 O
    7 G9 I3 D  j; e; M; G
        plt.legend(loc='upper right')) o) A* ]$ j3 e$ H. M& V
    " c& d* ?" P7 I, A
    : @- c- w5 d4 e7 l9 a
    ————————————————2 K) r1 Y3 u  [0 i2 n9 v4 D2 G
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 v# }' l. g, ^% y" B
    原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753' a, {& J7 x% |+ C( G- S

    " J, `; E2 Y: K" w6 R6 t' H# q- X. V$ 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-17 00:57 , Processed in 0.260591 second(s), 50 queries .

    回顶部