QQ登录

只需要一步,快速开始

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

    & j; `9 L; R& R/ U$ @一行Python代码有多强,可让图形秒变「手绘风」  S5 t( p; U# `
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具! M; V: z/ d& b6 ^. I- B

    ( P- g% ?& M  d
    / v" k+ M. W0 T# a5 h
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    ( `9 b2 W2 P7 ]0 b! B$ f. I- ^/ [/ @& i7 P% v
    7 V: X5 U% D& u9 W' _
    matplotlib.pyplot.xkcd()简介
    ) r. C8 K0 }' |" n5 G4 U这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小2 q3 Z: G2 T) `, ]+ [5 U5 d6 F; o' Y% d

    5 H$ y+ V5 ^( W  s" M

    ; f& A& @/ Y- u6 M6 y; T8 wmatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
    , E' |3 Y% u* y0 {* l% T0 b3 k) n                       length=100, #褶皱长度/ _& m3 [2 b9 S8 G6 ^6 C: J
                           randomness=2#褶皱的随机性
    * [; `1 k- d$ s( @& A+ c: k3 Z                      ). Q8 \2 s* n( d( J( t
    matplotlib.pyplot.xkcd()使用- v( v: z: @* O
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    ) q8 A2 o5 H+ y" I1 ~% W
    : U$ I& e- n1 x" T" N2 Q0 I
    7 s8 V4 `* z! m" r! }  H2 u
    with plt.xkcd(scale=1, length=100, randomness=2):
    + c2 f4 o8 B: `: e" @6 q7 }#with是临时使用一下,不影响其它图使用正常样式/ M6 H/ n% G+ T: c+ Z* x
        绘图代码
      g2 S8 b- M6 G: ?( \    。。。。。。" J* ]6 K5 l; S- B
        plt.show()
    ; R0 [5 Z. m; b2 Xmatplotlib.pyplot.xkcd()使用实例 7 T* L& H9 J0 V- D9 \
    下面代码为pythonic生物人公众号之前的文章代码8 x; H4 q# v& W
    ( h$ w( m# ?" Y1 o/ J

    $ C- C6 B& X0 O7 O! h/ B以下参考:Python可视化25|seaborn绘制矩阵图# H& L6 B. h4 l
    4 C& j  Z7 n/ ?! B+ {: d8 Y8 o$ z
    - x& b$ F6 h6 o  _7 Z' r& [( I
    #支持seaborn3 P) x; P; Z3 c6 ?
    import seaborn as sns
    , Q, [* M$ A4 Y' l% o% F' v) M/ Giris_sns = sns.load_dataset("iris"); W& l' w# s+ @5 [( ~
    with plt.xkcd():+ X" ^6 v2 U$ l3 t
        g = sns.pairplot(* i# W8 S9 J7 D' S7 F+ P
            iris_sns,
    # W' ~" _; h# ?+ ^9 t+ q! r        hue='species',  #按照三种花分类6 O0 m) L( F% m7 |# u$ z$ M
            palette=['#dc2624', '#2b4750', '#45a0a2'])
    # p- s5 S* ?7 }$ {* ?" ~5 z; s    sns.set(style='whitegrid')
    6 V( P, v$ r* F5 a& |  K% m    g.fig.set_size_inches(12, 12)7 u. }( G! C2 T' R: }
        sns.set(style='whitegrid', font_scale=1.5)) p6 n* y& Q1 x/ U
      
    7 w. N% w- i: Z6 M/ _8 h) y/ J
    $ P. [3 v; H. t& z

    " R/ ~$ I1 D9 u2 W# l* }以下参考:Python可视化29|matplotlib-饼图(pie)
    9 ^3 ?. k% f% V. i+ m; h
    & A; X) J% l& U3 G% ?
    . n+ T) W6 `2 \% d
    import matplotlib.pyplot as plt1 b" m8 J% j5 l8 P; I! @8 O$ ~
    with plt.xkcd() C* z  X$ w# p" {3 c) }4 o
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度1 G' y8 X' S# E! w' G
            length=120,  #褶皱长度
    & o3 Z; k4 K0 e/ J, P        randomness=2):  #褶皱的随机性/ T2 z: J7 C9 J' m: d6 m) n
        plt.figure(dpi=150)
    + x8 b) _8 `8 q. l! k, A) [; `# m2 r    patches, texts, autotexts = plt.pie(
    1 }7 K* L! y& e- h7 w8 s        x=[1, 2, 3],  #返回三个对象
    0 a+ ]4 N- S1 z- w        labels=['A', 'B', 'C'],1 Z, |0 y! `& |, E7 E
            colors=['#dc2624', '#2b4750', '#45a0a2'],) W. n' s6 w" t) S  W
            autopct='%.2f%%',4 x$ ?* {* v3 B5 {3 B
            explode=(0.1, 0, 0))
    # N* k* [( x7 N2 s' S7 n. G$ n- [    texts[1].set_size('20')  #修改B的大小/ G6 a8 \$ z/ B, \2 E: P

    2 G' J* S! W  I' [0 F( I* ?    #matplotlib.patches.Wedge1 w0 x: K. c  U! D
        patches[0].set_alpha(0.3)  #A组分设置透明度
    ' P; [4 h  f/ L* f( K. ~    patches[2].set_hatch('|')  #C组分添加网格线8 v0 u0 m9 p- P! x8 X2 X) o: |  t
        patches[1].set_hatch('x')
    ' m9 V( l/ M3 D/ z# D , a4 [2 ^- @0 Y" v- L3 |0 G+ q+ ?
        plt.legend(
    3 @0 a8 y. z- D! |' r  W$ J( k        patches,
    " K* \8 r8 E3 z( G1 g        ['A', 'B', 'C'],  #添加图例3 l# A& |$ H; g% ~
            title="Pie Learning",
    0 T. v# f6 q* c- Q: V( K& v/ U6 f        loc="center left",
    / K. b& i- H. R6 u* o        fontsize=15,
    4 I( k+ ?/ d3 d        bbox_to_anchor=(1, 0, 0.5, 1))# _+ ?1 _7 u0 T  ]4 N0 P4 c6 V% r. a
    # {! Q! G, s7 y) d- ?$ {
        plt.title('Lovely pie', size=20)
    . B2 O7 I& L/ z2 m    plt.show()$ ]; |. u) o: d; M5 g4 y
    2 u( v. `, G* ^2 i9 B& Q
    / J. n" U8 I0 i1 {

    0 S! _( I8 M- Y2 K7 h. s
    : A8 b8 B+ e7 g. n8 e) k$ D
    with plt.xkcd():
    ! f% P2 u. o8 i2 y) M) {* C, J    from string import ascii_letters
    5 j* }3 e- e; j& a, R0 R    plt.figure(dpi=150)
    * ~! V! H- X7 `% Y    patches, texts, autotexts = plt.pie(3 G5 Q0 @9 k% h3 J  @3 J, |
            x=range(1, 12),
    3 D$ w/ u! t+ Y        labels=list(ascii_letters[26:])[0:11],: \2 F4 N  l3 m( G
            colors=[! `. ^# {3 Y: b' _  v# Y
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',& D/ U" j; P! R1 C% f5 D
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'- ^: R5 Y- v3 f% A+ V
            ],+ v6 A  u* g1 f2 |' J3 ?$ o
            autopct='%.2f%%',
    : M! K$ L$ t" [    )+ w1 @3 P: i3 |; P
        plt.legend(
    2 C5 u2 n8 I& P        patches,
    6 |3 Z' q7 _$ ^        list(ascii_letters[26:])[0:11],  #添加图例! s9 K8 O- K2 s8 A8 }2 ^3 H/ c
            title="Pie Learning",8 z8 X- u, C% q- C6 u  |$ k
            loc="center left",
    ! y& e' g+ b8 R' F        bbox_to_anchor=(1, 0, 0.5, 1),
    / ?1 ~9 p( V. J" R, s" |* y* n        ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    # e0 X$ Q" A: R5 [+ N5 n    )2 A1 v% ^& T: H, c- A4 h9 r
    7 P$ U5 b7 W0 j

    ' n4 a' H! Y$ e; c3 k4 e' T4 M* F
    ' X& ]7 F1 R, j3 ?% `
    * Q7 ~3 g2 P7 m# @1 d5 d6 f) c7 B
    import matplotlib.pyplot as plt( |3 s! g+ g/ y, g  j
    import numpy as np8 R* _5 l0 d& j. y3 ~1 `
    with plt.xkcd():" n, L/ c5 A  E; H) B$ ~
        plt.figure(dpi=150)
    + a3 V% c6 d( R$ i    labels = ['Jack', 'Rose', 'Jimmy']
    - [& d3 i9 N+ F# z* n    year_2019 = np.arange(1, 4)
    ) c7 k4 Q. ~" X+ [    year_2020 = np.arange(1, 4) + 1" C, n/ D! l& F6 k* d" q$ N
        bar_width = 0.4
    5 T7 k8 g# q  X7 @* S+ ^ 5 b- ~, g) g/ n/ j7 b+ X
        plt.bar(! d  p) F& k! I  Z3 G" H5 W
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽/ |, @5 a1 o; d. K1 Y
            year_2019,
    - S6 t6 d! @7 A$ o: J9 [        color='#dc2624',
    + D5 f& D' B1 P- j        width=bar_width,! V) a8 V2 U; t# w. {( {+ a& w
            label='year_2019'  #图例0 R. L9 y3 U5 l2 r( O$ C
        )
    2 V  d5 P2 z$ _, p8 s  C3 [- O    plt.bar(1 l3 w7 Z3 u- S
            np.arange(len(labels)) + bar_width / 2,
    4 P0 ^2 G) J' F+ o1 k: Y; E2 U7 g6 I        year_2020,% |9 c& ^4 H* x7 g7 S' N
            color='#45a0a2',* e  J* g0 Y0 q& _( o) G
            width=bar_width,
    ) m6 W2 k  ]: b% a$ E        label='year_2020'  #图例) Q9 U  l; F: e0 o/ X
        )% @( `/ e1 {# y# ?$ D
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称3 }4 }* h) d# D
        plt.legend(loc=2)  #图例在左边5 }  Q6 N  h, m% k. [
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
    ; F! M; P+ n3 J# Z9 c3 p1 k& k9 _# N# K. H/ Y) Q% E" X

    ' ^7 b9 s' r$ H! k" Q- v! C% w. O! K$ A
    : j4 z! y, n* e& U8 o9 E# p

    ; F- N' k# l  q! H5 Q
    3 B7 s+ u# _3 l3 V6 [: O
    以下参考: Python可视化|matplotlib10-绘制散点图scatter
    1 j- O, M" V2 U$ e1 J& S
    ! f6 ~% _9 a$ m. I

    : r/ i' A# Q, eimport matplotlib.pyplot as plt. u! I" D: p; d  G' e
    import numpy as np# Z: ^9 Y# S. d3 g& N6 F  ]
    import pandas as pd$ ~* O0 y0 W) r' O: r$ {# w
    from pandas import Series, DataFrame
    ) u- k( A* b- {" I3 p9 \: n* C#数据准备
    7 }$ e8 {8 Y# w- X# K0 C: hfrom sklearn import datasets
      w! H! w$ q4 z- i7 x" Z$ C* ], a
    : ?4 A! S0 c* `0 `iris = datasets.load_iris()# y$ D6 G- g  l) B/ N- ?
    x, y = iris.data, iris.target6 ~* E/ Y! n/ V! l* g
    pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),' C2 y$ N8 ?5 X2 L, e8 A. L
                           columns=[
    ! c7 q0 d: W- ?. D- c: a% y  T                           'sepal length(cm)', 'sepal width(cm)',
    $ }7 l! ]7 i6 d; h. f5 D4 Q* g                           'petal length(cm)', 'petal width(cm)', 'class'! ?$ O- |- A/ y
                           ])
    . X6 C& Y9 b& Y0 X& v( ]with plt.xkcd():9 u& b. o2 B" y- ^) B

    - p8 P5 ]# h% w7 B    plt.figure(dpi=150)  #设置图的分辨率
      X: ^$ _8 Z7 t; j+ N, E9 I% t' k    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图$ x4 X1 x. `" }8 K( z5 G% L: m
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类4 {& {# y6 d8 X5 Y
        iris_name = iris.target_names  #获取每一类的名称. D+ F3 x: |% {) X. P, K6 E/ {
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色) i; q8 r& }8 q" U7 z( w
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形
    5 @) i6 o0 |1 u7 F1 x
      t/ I+ c, M+ l- P- x  R, I    for i in range(len(iris_type)):2 _9 ?  d* w4 a
            plt.scatter(
    3 k& h  }  Y9 U2 Q' k0 I            pd_iris.loc[pd_iris['class'] == iris_type,
    ( c7 w7 d- T( M                        'sepal length(cm)'],  #传入数据x' O$ b4 D! s% m6 C* x7 O
                pd_iris.loc[pd_iris['class'] == iris_type,
    : c' s/ }% a; k                        'sepal width(cm)'],  #传入数据y
    7 [+ X6 C( Z, s! S; a. L' Y            s=50,  #散点图形(marker)的大小
    ! P7 J- E3 L, z) R5 j" }            c=colors,  #marker颜色
    + M, ]8 n& z4 V/ L1 |  Q9 j            marker=markers,  #marker形状
    2 l: B1 j1 j, B            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    $ I5 m2 ^% e( e            alpha=0.8,  #marker透明度,范围为0-1
    $ Y$ M; l0 G- y' x            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    % u2 B4 }+ G1 j            edgecolors='none',  #marker的边缘线色1 D) X9 O% w2 h7 D  N: J6 V
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用- I) j0 q$ t0 l
                label=iris_name)  #后面图例的名称取自label
    1 p: @1 {; P" _+ B! ? & L  @9 r' f& u" f+ x# b
        plt.legend(loc='upper right'), Q4 i5 m$ c" o4 J

    1 o" Z$ B  G4 N- q& ^
    2 w* I0 Y4 B( T/ ]
    ————————————————0 A/ }+ n0 V, g, I" D! H# ?
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    # M$ R) A3 @3 C) [原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753* t/ J1 M+ g; `" W1 O4 u3 o

    5 P% W$ b* g2 Z+ }
    . X1 P4 e& t2 o' c* H! P
    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 07:11 , Processed in 0.415583 second(s), 51 queries .

    回顶部