QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6290|回复: 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
    9 \- L( r+ U5 R
    一行Python代码有多强,可让图形秒变「手绘风」7 A; L% e& i0 \, y8 D
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    , K9 {# n3 r' a( l! p. s$ y$ n# W8 V. N  t- |0 |4 \
    8 F& R7 i- T- b* v5 K5 A* k& C8 I
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    + ]  L) q1 f2 [3 i3 [
    " a& a5 G) K% x6 W3 h/ Z# |
    ; [: D+ W6 S( |2 G: [7 G  O
    matplotlib.pyplot.xkcd()简介& V( |; U( J5 r% R  ^& T
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    & x4 x+ a3 ?! j. a# b; P5 W! a

    + C* \0 }0 d- J( ~) F1 R: Rmatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度) ?( }' C* M* a* v
                           length=100, #褶皱长度! {6 [& c# a" v; {
                           randomness=2#褶皱的随机性
    8 V( o! w$ x9 E/ c7 m7 _+ |3 W$ T                      )
    $ [; [2 c0 G& z, v: T* @3 Fmatplotlib.pyplot.xkcd()使用5 g8 ~2 o, P; x% R
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    + ^/ H  [3 J0 M. R4 E% r1 }3 i! ?0 m- m. D  T/ ?

    : O8 m: M. N9 X0 o- k1 Jwith plt.xkcd(scale=1, length=100, randomness=2):5 Z/ s7 N* o4 d9 E9 j
    #with是临时使用一下,不影响其它图使用正常样式) p- S9 H6 @( i0 x
        绘图代码
    6 v  Z: E5 X$ E$ F! h! p    。。。。。。+ X, z* B* e  u4 f9 U
        plt.show()6 Q8 G0 U' A; X: n( E. T
    matplotlib.pyplot.xkcd()使用实例 " l! h' |9 s3 g" N+ f5 |+ l& r
    下面代码为pythonic生物人公众号之前的文章代码6 n) w9 W& W0 l& c
    + _( b2 d8 o. y% |3 l/ m6 X9 @
    6 A, h- v8 l" z$ c4 z* D+ Q
    以下参考:Python可视化25|seaborn绘制矩阵图
    7 i, \3 H& E, c7 L) a, d( L6 B) |& ~; M9 a& A" c! X

    , W+ {: \! i' U. C3 Q#支持seaborn
    & A  v6 i# p" }) P% t* Himport seaborn as sns
    % P5 W. T- s% M" \! Eiris_sns = sns.load_dataset("iris")0 \. X1 a5 d# Y
    with plt.xkcd():; ]$ A1 A9 e  l4 K) u( x
        g = sns.pairplot(
    3 [1 x1 D0 b- s6 Z5 k' N5 n( S        iris_sns,3 u9 |2 E0 A/ m/ D+ j
            hue='species',  #按照三种花分类
    - w. v7 K$ i* |        palette=['#dc2624', '#2b4750', '#45a0a2'])! M# `# S% N& D+ Q9 v4 o
        sns.set(style='whitegrid')
    7 C( O0 j. q# x! f    g.fig.set_size_inches(12, 12)* K# Q: W* k6 A8 L4 `4 Q
        sns.set(style='whitegrid', font_scale=1.5)* ~$ U- }2 F1 a2 r1 f
      
    & D( W; A" q9 n) M: W
    $ e2 j. i# b7 V/ f! G& ?# V

    / [) V' e! j, r! I6 o0 P( p以下参考:Python可视化29|matplotlib-饼图(pie) ; p2 G1 F% {4 H

    . z* k. V* f, D4 S
    * l+ K9 ^* U! b6 ~0 ^, m  m4 a, L; V7 I- ^
    import matplotlib.pyplot as plt
    1 t+ E5 n# y, v6 D) i9 hwith plt.xkcd(
    $ u- H. t( q, Z5 V        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度2 ?) ^( i9 l7 j% C
            length=120,  #褶皱长度( Y7 a0 f! o: ^& w# L9 ~$ R
            randomness=2):  #褶皱的随机性
    8 F+ Z- w% G6 s1 w0 L    plt.figure(dpi=150)
    3 f8 y4 a# [+ S& Z3 S, v    patches, texts, autotexts = plt.pie(1 |& P" f5 C; W# Q
            x=[1, 2, 3],  #返回三个对象
    ) k# y  D" v' V1 @" H. p        labels=['A', 'B', 'C'],
    5 o' M: {* v; C. t- t# e        colors=['#dc2624', '#2b4750', '#45a0a2'],3 B" Z3 z* I3 h- v
            autopct='%.2f%%',- v+ |3 d6 y# D
            explode=(0.1, 0, 0))
    2 r( A0 K  X3 V    texts[1].set_size('20')  #修改B的大小
    2 B" y5 S7 A  S9 L
    " f+ Y$ _( I" z* j; v    #matplotlib.patches.Wedge
    1 z9 w  t; I  i5 p3 z4 E% m    patches[0].set_alpha(0.3)  #A组分设置透明度. Y; Y" R7 a* a3 b! [3 [; M
        patches[2].set_hatch('|')  #C组分添加网格线3 Z3 ~! V0 @. O4 R5 G) A- C) R( [
        patches[1].set_hatch('x')
    6 U  Y* G- i; T' \( J. \1 Y# I
    5 H* h6 E0 _3 m' o+ i! E8 s9 m6 q    plt.legend(
      ]& O4 B9 `- J2 g        patches,
    $ ]0 W+ J3 g' C) N9 @( D+ K# C6 l        ['A', 'B', 'C'],  #添加图例
    6 {' R& e  I/ Q* @- v9 P        title="Pie Learning",& r1 t8 C0 V7 c. W' J
            loc="center left",
    8 X$ I2 ]. a' W$ ~- b+ s( n        fontsize=15,
    5 j. ^* M, q* z$ x6 Y        bbox_to_anchor=(1, 0, 0.5, 1))
    , I# t. G2 W1 ], o3 T3 m
    6 x) n& q8 W4 N5 ?8 j    plt.title('Lovely pie', size=20)9 q5 u& k/ S  x  }! Z' ^" i
        plt.show()
    ! m: s- {' r( B
    7 p) ^! r4 d' e9 |- {

      a" h9 D5 o3 a& G/ u
    # U6 A0 ^6 D% s
    ' F4 A4 v! J8 Y) F- B" H+ J6 g" h
    with plt.xkcd():+ ~, ]+ C0 \: ~; V' h8 @8 |  w
        from string import ascii_letters
    ( C! `/ V5 e& H5 [4 l7 Q    plt.figure(dpi=150)
    % B7 U" t2 X% m8 L# X( P    patches, texts, autotexts = plt.pie(
    & d. a3 P. W3 r2 l1 }% \2 B        x=range(1, 12),4 P  H  V0 _9 L6 r6 V( f
            labels=list(ascii_letters[26:])[0:11],
    $ Q# C. _) F) \1 Y4 ]4 V: i; W        colors=[
    + M5 n( q6 Z! `" f5 }6 X' b) }% N6 k            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
    & B' v- h$ i) i1 g7 l; _  x            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    $ G* \3 m& ]1 e; l        ],# `- e3 o& p- L+ @- u
            autopct='%.2f%%',* H* w9 p( ]- ?, }
        )1 ?+ h4 T, ?2 t( f. M: X
        plt.legend(
    2 U9 m" \# |+ a( ?1 S  n  |- I        patches,
    & x: `9 o  Y9 L0 S2 \4 F/ `        list(ascii_letters[26:])[0:11],  #添加图例8 L" y( [* P. M
            title="Pie Learning",1 W% ^7 Z' i/ {* ~* w; ?$ Q
            loc="center left",; x6 {6 b; L9 J1 {$ @8 l0 }2 u' p1 P
            bbox_to_anchor=(1, 0, 0.5, 1),+ z; O/ f7 f1 G7 t+ h1 f
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    1 k0 J4 R! y8 Z, [: \    )% w3 k& U! T& S0 Z' p; F
    4 H/ O3 i) \6 @( }6 a7 h; H
    1 |. x" ?( U/ J7 q! l3 N! m( z, }

    ( u5 [7 [+ L( a0 B7 P1 c
    # |. {' f( d1 x5 I& t! R
    import matplotlib.pyplot as plt6 R( k/ C$ h; L
    import numpy as np
    5 R. M2 r8 c  C9 N. @with plt.xkcd():8 Y7 J& {: t+ K! g* a& L9 @
        plt.figure(dpi=150)
    9 q) D! w# M- M( {, t/ o    labels = ['Jack', 'Rose', 'Jimmy']& u' \  i  W$ [7 y6 q
        year_2019 = np.arange(1, 4)6 G- G5 G: C( }
        year_2020 = np.arange(1, 4) + 1
    ; z& l- v6 l1 m( U0 V    bar_width = 0.4
    % q, K" P7 `' @' P/ g/ ]" K5 H
    ) n1 ?/ j3 C% ?, {5 U    plt.bar(
    5 l+ _) Z9 p, D* Q" ~. A# I) O, M        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽! w8 Q! A- [) o  M1 b% S
            year_2019,1 X6 z+ @: x# b% ^( g+ c* {
            color='#dc2624',
    8 p7 C0 v& n5 j0 j7 @        width=bar_width,
    + x& d' f' `8 X: K; y$ \/ V        label='year_2019'  #图例  X; {! P3 B$ k1 D3 M$ M
        )' _8 t" ~9 {- C& ]
        plt.bar(; s  z) X( C( k# j+ g' M( ]2 c3 I
            np.arange(len(labels)) + bar_width / 2,
    0 M0 f1 B$ W7 H' l! u$ f        year_2020,
    2 c6 s  {( Q5 e: Q        color='#45a0a2',
    , O# s5 x. W. P( m        width=bar_width,
    9 R9 r; ]; ]* q% c8 Q        label='year_2020'  #图例* Z4 L' i: ?, Q; }
        )
    ! R5 D7 K5 |5 f  N    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称( k2 W- g7 T  _! n! P* k. ], t6 n
        plt.legend(loc=2)  #图例在左边6 O* E! c( }2 ?9 X
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 8 C! z  U" [' G  a$ i

    . k' A  Z+ A+ {4 q0 t- I2 ~4 M

    0 V0 N5 S5 V1 E3 `7 v
    - O* ~& U" _4 C* Y+ U

      U0 F- D8 F( f
    - x4 O" C8 m7 J

    & d% E8 ~7 H$ O' T( [) h以下参考: Python可视化|matplotlib10-绘制散点图scatter
    0 h+ L' E5 _2 I2 |! q# M, M9 V; \7 W* s" g6 _
    7 E$ [, V4 E! I9 C+ D2 ~' `
    import matplotlib.pyplot as plt
    & V1 h1 M9 G) s: K. Himport numpy as np, o' V8 n  p' y. F
    import pandas as pd
    & N( x  W' {. q8 h+ @from pandas import Series, DataFrame
    # ]) Y0 j8 T) X2 e, L; S& c+ K* V#数据准备
    & X% m. f" V6 \from sklearn import datasets- B9 t# \5 ^% i  R7 b" ]

      B- a7 @3 A! `, u# R! X1 Xiris = datasets.load_iris()
    $ f3 b8 g. f) u( tx, y = iris.data, iris.target
    . o% |- w3 j" x& Bpd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
    5 Q6 e/ D9 q* J0 }$ V# z% e                       columns=[9 v7 r" ]2 G) v2 |8 l
                               'sepal length(cm)', 'sepal width(cm)',
    7 V, [5 A% N- R2 f0 _" D1 N                           'petal length(cm)', 'petal width(cm)', 'class'
    ) |- }9 m4 l  G8 I' c4 E                       ])0 H; L9 j, v9 F3 _0 U2 h
    with plt.xkcd():
    9 r, y% s% b" A1 P& F/ p5 E1 ?
      Q1 K; f5 G0 `# F% g# s! h, q    plt.figure(dpi=150)  #设置图的分辨率9 `8 B( e$ _6 p/ G7 x3 {
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    , @6 S+ ~8 G8 X! ~" U( y, b    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类1 W: t0 o+ H0 R9 r; p  m7 O, F2 l
        iris_name = iris.target_names  #获取每一类的名称* i* ~: ~! p! i7 p) @
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
    ' b- U. @, z0 Q1 Z9 q% S    markers = ['$\clubsuit$', '.', '+']  #三种不同图形
    8 e1 |3 ~! e3 h" Y0 X, v- n ; G, A" m+ L! W9 a6 ]
        for i in range(len(iris_type)):
    / ?  O+ |; L9 s% R7 l3 r5 S        plt.scatter($ E/ b8 }$ n0 a3 S
                pd_iris.loc[pd_iris['class'] == iris_type," f- z& Y* `$ v" z0 e
                            'sepal length(cm)'],  #传入数据x
    ( h* W4 W' O; y, N6 ]" o            pd_iris.loc[pd_iris['class'] == iris_type,
    $ b) a; O& q' z  H$ m0 S2 {- ?                        'sepal width(cm)'],  #传入数据y
    & m+ L) w1 \3 H$ R* s  e            s=50,  #散点图形(marker)的大小
    # H" g; C; {3 e, ~9 |. i% ^5 A- b            c=colors,  #marker颜色
    7 @. Y! R0 q& u9 M; L            marker=markers,  #marker形状3 L' H* H; G6 [. o% U2 @- z2 \
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    ( Q: t0 e5 t* q( T# {            alpha=0.8,  #marker透明度,范围为0-1
    5 R( }! J5 n" Z' f            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c9 R- E0 Y/ [% M7 l$ A$ m
                edgecolors='none',  #marker的边缘线色- u; U. X1 h- [1 ~& ~/ j
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用* ~/ X. q6 \7 b" Q+ Y4 J2 ?2 p  I
                label=iris_name)  #后面图例的名称取自label
    4 i' C, O4 r! l% ^" Y4 E
    + \9 O0 M8 t* q0 u; q6 R    plt.legend(loc='upper right')
      _; Q. m2 J8 c
    4 Q$ R  k* V' v2 Z: G' c! B

    7 `2 @( B3 s2 l4 R" C1 C————————————————
    * |5 z+ Q! r' [9 n版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 @! o. s, b. I. Z! O& ~7 B
    原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
    1 U% p' }! q' m3 @4 n# N5 o8 P" q
    + \( W4 U9 Y% x& W3 l! G2 r! N4 S9 L1 o+ A, v8 i
    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 07:34 , Processed in 0.515944 second(s), 51 queries .

    回顶部