QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6259|回复: 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 E6 `7 |7 Q9 x$ h' [
    一行Python代码有多强,可让图形秒变「手绘风」  k& q& X9 T, |; c) j# J. ?/ t
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    4 _& N) Y* K1 K& L, y: [; X4 \: J! o  v/ o
      X3 d5 L; c/ b! f- w
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。+ I* X( p; P* m$ ~) r5 H
    . Z1 F6 O: F2 [2 G/ h; Q( j
    5 m# G. b6 a) J- s, L  Y
    matplotlib.pyplot.xkcd()简介
    , b! n$ h( k- t  ]3 f  v* i' N- x这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小; h% C% \; n8 x1 f3 T& j+ U

    7 y+ }8 v! @, s7 X* r
    9 Z5 m) o. V  o! }8 R3 p3 E
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度# Y. D  }! f# A* ~# f
                           length=100, #褶皱长度
    ; J! e* Z0 S4 w4 ~  \2 ?6 n& e, X6 k                       randomness=2#褶皱的随机性
    9 m. O9 w% K! v0 `+ A- A                      )
    6 |* N) w( H. G$ `  O7 k$ _matplotlib.pyplot.xkcd()使用
    ( D6 K' w0 k( h, m$ E如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    8 c, V# c  {( \4 u# f/ R
    1 m" \! I7 Y, B; z

    1 ^2 d4 a! j- o) u8 gwith plt.xkcd(scale=1, length=100, randomness=2):' r. h  B  q6 q: J9 e. o/ Z* e) P5 [
    #with是临时使用一下,不影响其它图使用正常样式
    8 S3 [9 ^8 W, F# _8 Z    绘图代码( o! C/ \' w5 X0 O1 C0 N4 ]
        。。。。。。
    * M9 [  s( \* A# ^    plt.show()# I0 u; F9 k) c5 D9 _7 G
    matplotlib.pyplot.xkcd()使用实例 . j2 Z' x, d/ Z
    下面代码为pythonic生物人公众号之前的文章代码
    4 V; C6 E, E% V3 B& H' T, V9 E3 ^# S- o2 v4 c6 _& R
    8 H$ O: X6 t4 T# B7 ~- L1 B
    以下参考:Python可视化25|seaborn绘制矩阵图5 g3 k4 O- s( a9 g, ~
    ' F6 z0 i+ \* o2 p: ^2 b
    : }/ W3 Z& x' O
    #支持seaborn
    8 ]1 x9 j. v+ p/ l: oimport seaborn as sns" D+ C0 P( U0 l1 k; e8 D& ?
    iris_sns = sns.load_dataset("iris")/ {0 |7 V0 q' Y6 J% w: R9 P7 K* A
    with plt.xkcd():4 h* E! h9 D1 @) ?  t: n
        g = sns.pairplot(
    ; V7 u- _+ {% \        iris_sns,
    : t0 v1 M# a2 M6 O' W        hue='species',  #按照三种花分类6 M  a% f8 k8 ]" |$ h1 ?2 q& f
            palette=['#dc2624', '#2b4750', '#45a0a2'])5 B$ o4 ^) k, j+ Z7 `
        sns.set(style='whitegrid')
    / Y+ B1 r/ G1 e' h. u* n    g.fig.set_size_inches(12, 12)
    0 }* N1 y  e% ]) r4 ]. H) c2 P    sns.set(style='whitegrid', font_scale=1.5)
    9 [/ k/ Z/ p3 M9 U  9 n: \) @" J! F. S
    ) T% Y, t/ [' N0 o, W

    9 J6 U0 y( U( ?( q2 s2 g以下参考:Python可视化29|matplotlib-饼图(pie)
      t* p% q& f) x* w) w; P$ U
    & l: k! T' s0 L4 y% w

    ( O( K2 ?- H+ n" ^1 U# |import matplotlib.pyplot as plt4 T8 F" {1 V0 K% W/ E  P
    with plt.xkcd(1 A& x) a: J- B% O
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度9 A( l. I/ K/ e& `
            length=120,  #褶皱长度
    6 |/ ?  c8 v+ ~        randomness=2):  #褶皱的随机性
    , M/ ~2 L  ]6 ~: e5 j    plt.figure(dpi=150); s  S2 R( e* v3 B; f. R
        patches, texts, autotexts = plt.pie(  I& `& C8 \# r/ J6 }
            x=[1, 2, 3],  #返回三个对象
    ( x, {! ]0 m! k/ t9 P5 `        labels=['A', 'B', 'C'],% }8 _' w9 ^8 s' y1 Q; i
            colors=['#dc2624', '#2b4750', '#45a0a2'],( u2 w: [0 V+ |/ f6 y
            autopct='%.2f%%',
    1 m5 d1 n  r% _: q7 U5 o" C4 H        explode=(0.1, 0, 0))
    * v' g8 v) k! ]: S3 [, ?9 k    texts[1].set_size('20')  #修改B的大小& {# X0 _$ X' S: C# e: E

    # p7 u2 s6 ?: N  T8 R& Z1 z    #matplotlib.patches.Wedge8 ~6 l" F/ G" I, v! x" ?
        patches[0].set_alpha(0.3)  #A组分设置透明度& s! C6 T, a- W; ]3 |1 r
        patches[2].set_hatch('|')  #C组分添加网格线
    $ @0 B; S7 s0 D' p/ ^$ M0 J  ^    patches[1].set_hatch('x')
    : ~) b- j7 k- T0 L. p* i
    6 I. G9 P4 o+ p8 ^    plt.legend(
    : V& F! v: k# S' }1 {2 n( q! k        patches,/ @$ \  b  K) Y# X/ l
            ['A', 'B', 'C'],  #添加图例3 c5 u, Q4 M5 Q$ P( N9 ?6 I* v
            title="Pie Learning",
    , P. T! c# S2 n        loc="center left",
    ' @$ H1 Q6 h6 q$ _! y: G" c        fontsize=15,3 A5 J- }6 x/ F" I. N  n
            bbox_to_anchor=(1, 0, 0.5, 1))& L' }% Y, _* ]
    6 M4 T# I" |* \2 t" w$ H
        plt.title('Lovely pie', size=20)
    0 s) z& x- U/ F# ?# ~* `    plt.show()& b! S+ M1 P4 `

    6 v, d  g1 u+ f- n7 M
    2 \' x$ ]) ~- U" A6 J; h# _& E' J
    8 j; }0 w) G  i6 {3 Q4 R

    9 [* [0 \' Z6 I# j) Iwith plt.xkcd():
    - Y: G0 ^9 ~3 v* k  s    from string import ascii_letters
    " T5 F% x  j5 y" S3 i" q& x; R    plt.figure(dpi=150)
    3 B0 ^3 `, g$ n( B9 R) Y% o    patches, texts, autotexts = plt.pie(
    * Y" P( E/ ?0 g  D. f+ Q        x=range(1, 12),- x( D! E1 s& R( r( U
            labels=list(ascii_letters[26:])[0:11],4 n( l5 Z- |5 _
            colors=[" b+ f, e. i6 F/ K& _
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
    2 G; W( E$ s) E! d5 \            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    0 ?7 J/ a1 G9 n, H. d$ I8 g4 N: X        ],4 n6 V  @. e8 k/ H
            autopct='%.2f%%',
    3 U* B( H; h& e! ~    )( P0 V# r: x3 T( R: J5 |* j! q  z
        plt.legend(
    $ V' _& v' U& [, f        patches,+ w1 s1 W6 O* o1 O! j4 N
            list(ascii_letters[26:])[0:11],  #添加图例: r7 l; ^* X- h  M7 B# s" t$ Z: Q
            title="Pie Learning",
    ) x9 S5 E' R$ j4 i        loc="center left",' E! [" C# k  h4 b7 u
            bbox_to_anchor=(1, 0, 0.5, 1),( P' K. J7 _2 L8 F( [
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    ( I* h1 w+ x/ b: c) C    )' @# M  Y! W8 I& r$ _; V

    5 A" s# J! e' d7 h

    : F* k' Y/ d* K, n5 [$ T
    2 m7 n2 s! o# V% d1 F5 f5 ]: l

    / [& f% `: @3 b5 E7 f2 z0 kimport matplotlib.pyplot as plt0 p3 L- J8 f1 A6 |9 v
    import numpy as np
    % A" a  f4 c! c8 Wwith plt.xkcd():
    5 r4 m  ^% {" r3 z& P    plt.figure(dpi=150)
    * v0 j2 n+ ~- \/ H    labels = ['Jack', 'Rose', 'Jimmy']9 L4 s3 z( y/ J
        year_2019 = np.arange(1, 4)
    0 r5 p0 B" K0 Z# \& `, P+ C8 H    year_2020 = np.arange(1, 4) + 1, ]; E6 ~, N' |5 r) p: B
        bar_width = 0.4
    & c  j9 k* W$ G; R1 F) n ) U+ c' H9 N3 _+ F% }! A. o6 W
        plt.bar(6 k  U5 R+ N- {7 }' E! l
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    ! p$ l$ C" `# e        year_2019,( B: g; Y" p8 O0 j2 @# M
            color='#dc2624',
    0 S4 B4 y, F9 R* H        width=bar_width,
      E7 }% R$ Z: ], ^$ V, M3 l        label='year_2019'  #图例
    ' Z2 h* o  r/ U, Q    )
      l; c. q* Q7 t' o+ B    plt.bar(
    9 l( p9 g) k- ]1 o/ q/ @        np.arange(len(labels)) + bar_width / 2,
    , J* c+ h0 m; }2 g2 ?# g        year_2020,
    9 _* |' F1 W& D        color='#45a0a2',
    - x4 j/ L! `4 A+ r        width=bar_width,8 y, V/ y- u  }! J
            label='year_2020'  #图例
    . h9 L6 r# p3 X% f3 A    )1 m) I! E- ^( t' c6 M( G
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称
    ' A8 [$ ]: b9 E. w1 U+ E    plt.legend(loc=2)  #图例在左边
    : P* U( \) O* d1 l: [2 z) C7 A以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 - Q4 c/ r( {/ I9 A; q
    . n8 X3 k7 k) F: J  _2 p2 u/ v4 a7 ]

    ; |1 I9 Z; u, b' ^6 [0 K# z% w: E; V  u2 j8 q
    5 A, ^# H1 b( L! g0 N

    + F) e/ A+ n0 C, {1 f. F
    , v1 M- H* O0 q# j
    以下参考: Python可视化|matplotlib10-绘制散点图scatter# D% U0 n$ @" k, }. m; R

    : \# o2 m1 Y$ X' ?/ E
    3 g$ i5 p: t9 @9 u' i
    import matplotlib.pyplot as plt
    & |/ K; F3 I8 X7 J. S: r# Eimport numpy as np
    " {, O4 C* U( D( q0 H0 ]  iimport pandas as pd
    5 k8 y- ?" ]2 p( D6 c- ^* ^from pandas import Series, DataFrame& I$ w: P1 k: `  p: X; S1 p
    #数据准备
    % I* U6 G. t" n( Xfrom sklearn import datasets) X& h; @7 n% k; K( f
    0 o) b8 m; P2 F/ E7 |- W6 k  d
    iris = datasets.load_iris()/ b! A! }, A5 B3 }( ~4 Y: |" ~
    x, y = iris.data, iris.target1 D0 U/ R9 f4 J) Z4 q& R
    pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),+ e4 h, h, K2 Y8 G9 N: `
                           columns=[% b% [. i# n; O. \& d* T
                               'sepal length(cm)', 'sepal width(cm)',2 K% r  g  W6 l% y6 e5 S
                               'petal length(cm)', 'petal width(cm)', 'class'
    $ E5 S: b+ ~/ k0 |                       ])
    2 Y% J$ f5 l: }, |! U2 l( F- J/ uwith plt.xkcd():' r9 p; k" s, \5 e4 ]" e

    % q6 E. O7 U# {% _" X    plt.figure(dpi=150)  #设置图的分辨率
    . b9 w5 z! Y3 p6 U    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    : \) F' o. w1 L5 n" l    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
    * T" c, W6 u! O% A, V    iris_name = iris.target_names  #获取每一类的名称
    ! |% q& |: D$ F    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
    / n" k: }1 H. }) ^* f1 @. M    markers = ['$\clubsuit$', '.', '+']  #三种不同图形
    9 K' H2 s7 k1 G4 {$ j! I# _! F
    - r# H& |) `* }$ X& x# Q  E    for i in range(len(iris_type)):. A$ i2 W4 j( ?
            plt.scatter(
    ; \3 M, d! O4 V: E3 C2 C            pd_iris.loc[pd_iris['class'] == iris_type,  y- B! f! p! }. {
                            'sepal length(cm)'],  #传入数据x
    * V6 y5 \5 I; e; P  E2 q5 Q8 J& C            pd_iris.loc[pd_iris['class'] == iris_type,
    " I! K( A- }; D                        'sepal width(cm)'],  #传入数据y
    7 C6 u7 o8 N. R$ i% @            s=50,  #散点图形(marker)的大小2 c8 i- x' I: r' M1 w5 t  h, ?
                c=colors,  #marker颜色
    - N- F. u* j1 y: z/ }            marker=markers,  #marker形状
    & Y: U4 o' Z; H            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    7 L1 [; T+ g( d4 k! o/ Z( U            alpha=0.8,  #marker透明度,范围为0-1
    * t; T$ C: x2 u            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    / F# l6 N3 K: t: e" b            edgecolors='none',  #marker的边缘线色% P4 l: m2 p. P! Y% J2 P
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    5 ^; g$ _7 G$ t5 k& q            label=iris_name)  #后面图例的名称取自label
    6 S% _( N7 v- s5 h. Q
      D* G4 z2 m- h3 W3 ~    plt.legend(loc='upper right')5 J8 e/ j: B9 m: X. g! [4 k

    ! a2 t: k! A3 O
    0 F4 A( Y% L! J8 \; ?2 a
    ————————————————
    ! {) X7 |3 c; ^( V% a5 D版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* t9 U( A( P5 W
    原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
    + t6 f% E/ Q; T0 ?/ z" s5 I. B! N. K1 d  G0 n3 [; [8 L; U+ Q3 I& k7 }
    1 I* D7 {$ M/ e; w9 A
    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 06:16 , Processed in 0.418592 second(s), 51 queries .

    回顶部