QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6224|回复: 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
    5 \9 g* R& N4 Q
    一行Python代码有多强,可让图形秒变「手绘风」( D0 O$ _  ]+ l' y" z
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具! x$ a0 y8 l9 Q2 I2 n3 ~/ Y* K+ G

    . V) [" u) j+ P& C' `! \! D

    ; a% I# q+ p& w+ D' D但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    1 K$ |% g# I$ b8 N( C* }) j# |3 a6 w  g7 G& q. {
    7 B$ x% G* j7 e5 _+ _5 @! N
    matplotlib.pyplot.xkcd()简介
    6 p. d% T6 e7 ~7 Q这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    ) ?' R1 ?8 M- a( H
    2 T, H2 u  h1 X: V% J  v8 I9 Y
    : {! X- C: T# I0 S/ E! F/ W
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度# i- a! I5 I1 r2 F7 }% v3 l/ w
                           length=100, #褶皱长度
    : K8 ~8 \, M! z$ R3 V/ C2 _8 z1 F                       randomness=2#褶皱的随机性
    ' X. r# ]' _9 ?& |) [                      )
    7 g, q2 E  r( V- zmatplotlib.pyplot.xkcd()使用4 b8 n. S) V# X4 q8 t- ?4 P, E
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~( N8 M2 p, k6 W" l
    ' Q4 @( A; Z3 \3 e* _
    4 c5 M/ F5 _9 D! `2 m& O0 `
    with plt.xkcd(scale=1, length=100, randomness=2):
    * u% G$ K9 W4 t5 w: W  q#with是临时使用一下,不影响其它图使用正常样式2 T- K" T* @8 h' q% a
        绘图代码0 D  R7 f6 Q4 J# n+ f; U
        。。。。。。" e1 V1 z1 C+ }% R" }+ R
        plt.show()
    ( ^, @1 i: s+ |+ e; ?matplotlib.pyplot.xkcd()使用实例
    0 f/ u2 o+ F' |7 P% o- h下面代码为pythonic生物人公众号之前的文章代码$ B: f6 s( y8 ^$ O

    # k- G0 l1 Z4 {) A, D$ z

    2 M  r5 E0 a* b* O# ]以下参考:Python可视化25|seaborn绘制矩阵图
    ) C, `3 m# T- Z: W, C1 o$ ~, E4 r" M. _9 n! Z; E
    / ~) P, d9 h) X2 @# {
    #支持seaborn
    6 D  a- W- X& W. simport seaborn as sns
    / i9 X2 Q4 c8 S5 s/ ?* Tiris_sns = sns.load_dataset("iris")
    . g+ Z2 P+ k; Twith plt.xkcd():3 \" `5 W- N  Q3 `7 d7 u5 w
        g = sns.pairplot(9 o7 ^$ }7 D" g+ B! H& W
            iris_sns,
    2 b* g* P( D6 _6 N: D; v- n2 l/ Q        hue='species',  #按照三种花分类
    + t. o: w+ W  `        palette=['#dc2624', '#2b4750', '#45a0a2'])
    ( c" }# W2 `, F4 D; P0 Q* x    sns.set(style='whitegrid')3 A. b: Z: R1 p
        g.fig.set_size_inches(12, 12)
    9 I4 ]/ A8 y- T    sns.set(style='whitegrid', font_scale=1.5)6 h8 {, K& }& ~. ~1 M4 h
      
    ) |' m0 b6 X3 D$ N6 P$ z7 u* J1 i
    - \1 k( t% z. B% m

    % w% t- P. E& |! c0 r# o以下参考:Python可视化29|matplotlib-饼图(pie) : J: Y# i" {' }& C4 J% S& M2 w
    ! Z  k$ P! p: c( {) F

    * {( e, v. Y, s8 H# {. _, S" ?import matplotlib.pyplot as plt# q- B3 x6 _5 y( z
    with plt.xkcd(
    3 Q/ v$ Y" K: R0 V5 f* _  q        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度/ k6 Q* z+ P$ N
            length=120,  #褶皱长度! z' p& l! L" K8 i6 i6 s
            randomness=2):  #褶皱的随机性+ d' y3 A+ r' l: X
        plt.figure(dpi=150)* K6 D, L( ]2 z2 E) h- [
        patches, texts, autotexts = plt.pie(! }# k  G$ z( D% c3 P/ W
            x=[1, 2, 3],  #返回三个对象6 m- M+ h* G! {
            labels=['A', 'B', 'C'],
    3 |7 E% Y0 t& r        colors=['#dc2624', '#2b4750', '#45a0a2'],& j. g! W( t. m$ K
            autopct='%.2f%%',( b6 X" n8 k2 @
            explode=(0.1, 0, 0))
    - ]6 d' q4 |- \0 ~4 x1 {! v6 M- F. ]    texts[1].set_size('20')  #修改B的大小
      o- B) v6 ]7 s ; u  P/ ~! m8 k; H) Q
        #matplotlib.patches.Wedge
    " D0 m! w6 [+ N% r) q1 v    patches[0].set_alpha(0.3)  #A组分设置透明度
    2 l! }1 C1 [( o# F$ W  @    patches[2].set_hatch('|')  #C组分添加网格线
    8 ]: @  I# z: e9 ^! n# f/ @& A7 u! Z7 g    patches[1].set_hatch('x')
    " N7 M0 N; N# Z3 t + d9 V& o' F! D1 i
        plt.legend(2 Z6 x# e1 w, d8 c6 k
            patches,
    3 v2 Y  H9 F, f' I6 p* J        ['A', 'B', 'C'],  #添加图例
    & ?1 `! g1 {' _( e9 `: Z        title="Pie Learning",' K: t$ e+ H  O7 `
            loc="center left",& z$ _6 q, f3 Y2 }( Z: J) a
            fontsize=15,
    3 w% E' Y: f$ G4 N+ }        bbox_to_anchor=(1, 0, 0.5, 1))
    " u# O4 h2 k0 Q$ N8 l : r! \6 D% }. ^: o
        plt.title('Lovely pie', size=20)
    . I9 \3 b& K& F9 f4 y; {    plt.show()+ c" W2 [" x) {3 Q" z- S. z

    2 q8 [/ k4 p1 F! t
    ) N5 r8 a% P& d- M, `" Z$ L8 p
    ' Z  c; }- P7 C1 S: P
    9 S& f9 ]& b8 `% K3 K6 F
    with plt.xkcd():4 l& G9 S% J) d# W2 r* f; o- E
        from string import ascii_letters- [+ z. i  U1 G$ M5 U3 ~# y  v
        plt.figure(dpi=150)6 E+ o/ i, Z  U. }8 R
        patches, texts, autotexts = plt.pie(
    " G7 w8 I' |; Q( m, g. }' O        x=range(1, 12),( C9 j  o# A8 h! T! m" E
            labels=list(ascii_letters[26:])[0:11],
    ! ]) {0 F7 j3 a4 l) M4 Q5 y        colors=[
    + c5 q5 ?$ l, `9 b            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
    & j% z7 g+ Q# v, O+ C8 g4 a            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    $ k# q8 C; Q% B, D        ],
    5 U8 ]5 w. P+ z, {$ p+ `" W' o+ Q( Z        autopct='%.2f%%',
    ; S. n: n3 Z3 n    )
    . I3 T1 m- [4 z; f% t8 [    plt.legend(& P5 Q$ @* Z3 h- r9 i5 f
            patches,# q, _4 K% ~  B/ Z; j, u
            list(ascii_letters[26:])[0:11],  #添加图例6 b* s% I( J; ?' L: U
            title="Pie Learning",
    0 U5 B: J9 R* A, D4 M        loc="center left",
    7 |3 N. o8 R, y7 h+ Z. f        bbox_to_anchor=(1, 0, 0.5, 1),4 a1 s- K% }# E9 z# _7 |8 p) G+ H! O
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,3 [9 c3 ?& ?: O
        )
    1 [6 v- c$ m8 Z* U+ q
    6 \9 d: o; I( M/ k
    8 _( P' ~+ s4 b
    : y% I; f; h* f- k: O1 W9 `

    * o) G5 x4 r4 ^* nimport matplotlib.pyplot as plt
    - z$ n$ E5 t* x/ Ximport numpy as np
    $ D; z. }* \, z0 G& C5 e4 `5 Z( cwith plt.xkcd():* [: p# Q; v/ b0 P# A9 d; j- [
        plt.figure(dpi=150)4 |9 M  Y5 X" V" I! ]3 b; U
        labels = ['Jack', 'Rose', 'Jimmy']
    # s& g: L1 j) G* D! n' R    year_2019 = np.arange(1, 4)7 q" F8 W" K; B' T, \8 f
        year_2020 = np.arange(1, 4) + 14 Y( j6 R; ]6 C: i
        bar_width = 0.4
    2 n. ^; j; J# m! K: P  ]2 p. b
    & A, I! x- u6 h: z    plt.bar(
    1 f; e$ w" d( w  p        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽6 p! d9 f3 u- E7 ^
            year_2019,
    ) r3 s3 p* X# ]( P" O4 J        color='#dc2624',6 _5 G% v' W4 s+ z! O0 P7 r
            width=bar_width,
    + l5 o) Z' e% O$ o( J3 E6 B        label='year_2019'  #图例; u+ y* X& l8 g5 U+ O0 w; V$ v5 T
        )
    ! n2 C9 a3 W$ W6 j  J! e    plt.bar(
    ! H( M, W4 D, Q0 o- H  W        np.arange(len(labels)) + bar_width / 2,; E5 }1 Z3 }5 v5 c- D: H& A
            year_2020,% }9 O1 p; [' Z) ^$ z6 }: P
            color='#45a0a2',! v" C/ [1 B  ]  m& J
            width=bar_width,& }5 n  E1 r) ?: P
            label='year_2020'  #图例
    & _9 x1 ?3 v9 W    )! [: S2 w  R: g6 ^# B+ ~: S, Q! ~
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称# B9 }$ s$ m, y" x
        plt.legend(loc=2)  #图例在左边; v; j0 @1 Y  w# j
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 * l" V( E+ A/ F

    ! Z) M' J' v$ u  x; ?+ k, U; L
    " K$ k( ]% O' B, O; S( h% U% k
    + ~( `, {7 J& }
      D% R: z! g" u+ b' D& u7 w
    ! F( s$ V7 S4 }4 g; K" ?; j  A
    ) T2 J! L' }+ ?, R# y7 F7 I8 s
    以下参考: Python可视化|matplotlib10-绘制散点图scatter1 [4 h) q% a; x
    ; [- ]: R. i1 [" n2 F

    0 `, M; K/ ~( U" D4 I' Fimport matplotlib.pyplot as plt4 f  i3 m9 [. C1 ?$ z* D( {- Q% _
    import numpy as np) u  @: X/ L) G
    import pandas as pd3 _. I3 }) o- ?, G0 z
    from pandas import Series, DataFrame% ?& \5 _5 h& b5 q- K' r
    #数据准备
    ' g+ U' Y8 A! n2 Z1 T/ }from sklearn import datasets/ W$ b& c/ Z! E( I+ A  q+ U

    & ]# Q4 {+ k  S; @0 @/ K  d8 Liris = datasets.load_iris()- K' X& L+ t. J3 C/ V0 J9 y
    x, y = iris.data, iris.target2 \3 |+ y' ~; ^0 t
    pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),% m' U" h, k; V2 o/ @9 g. {; V
                           columns=[  d% p  b! K6 ]: U
                               'sepal length(cm)', 'sepal width(cm)',6 q, V# d2 I  g+ [% _1 y2 Q+ g. Z$ @
                               'petal length(cm)', 'petal width(cm)', 'class'
    5 p( n0 C  ?2 I- e$ K% c2 O                       ]); T/ _% O/ `3 Z3 f3 W5 [) F, E
    with plt.xkcd():' ^( n( }) a3 O6 ?' l! ^
    ! d. L! a; f: r! q5 g
        plt.figure(dpi=150)  #设置图的分辨率2 i( q  Q% M1 Z
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    2 }* Y0 n: e6 [6 a    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类8 G7 e: c: ?4 h4 o6 K
        iris_name = iris.target_names  #获取每一类的名称
      \; X; l. M" r$ ^& U  h9 F3 [" @    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色# Y9 C3 o" F' q2 I& J' Z7 w# p$ i
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形
    * N1 e4 @4 y% c 6 l* [( s( N6 d+ [0 y6 p
        for i in range(len(iris_type)):
    " O7 J/ Q! X" ^7 Q+ @$ i" r        plt.scatter(3 W2 e( y  t: w
                pd_iris.loc[pd_iris['class'] == iris_type,
    7 Q* G$ R# N8 e& l5 p, }                        'sepal length(cm)'],  #传入数据x
    7 [+ t; Y) L! ]            pd_iris.loc[pd_iris['class'] == iris_type,, ^4 ]- B+ [5 E# l  z
                            'sepal width(cm)'],  #传入数据y
    / U  V( ]( I% |- f3 \* S0 T            s=50,  #散点图形(marker)的大小
    , W; R. f; f" j5 C* E: E9 n% f( t            c=colors,  #marker颜色
    ! z/ N3 b( N" S2 M0 Z/ I" Q: L            marker=markers,  #marker形状
    1 B) Q- u$ ~( z/ J. p  ~: O            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充6 t! T7 P" }' t% K+ R; V
                alpha=0.8,  #marker透明度,范围为0-1+ M4 t3 Q* w. I; ?/ A; O
                facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c; |. U- U; e* r5 Y
                edgecolors='none',  #marker的边缘线色
    " ]$ P. T* _  K7 C            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用& U, Y% M* X7 X% ]! R$ s
                label=iris_name)  #后面图例的名称取自label. `2 K' ]% s% G/ X

    5 _' ]' T3 G) x$ _& V# c    plt.legend(loc='upper right')( [) z" i7 [: V" ?/ @
    / Z$ E# l; t1 A& f( J/ a
    8 ^; G* c2 X$ d( F+ b1 M. h( O
    ————————————————
    ; p* C/ G# w8 d版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    3 |6 q* O2 R3 Z- K原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753: |+ D2 Q) n- V0 N, @( b  J: c

    - G: R( k! \0 W: W5 f9 S/ m& `- m( R( q/ N. 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-19 09:41 , Processed in 0.475504 second(s), 51 queries .

    回顶部