QQ登录

只需要一步,快速开始

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

    . _. p0 X0 d  X5 A3 c3 l一行Python代码有多强,可让图形秒变「手绘风」
    & R4 B* y& ^+ c, E2 _0 U6 U2 Q之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    / L3 x7 W; H9 y" H6 N5 W( ^1 E# c* c& U( J1 X. I/ Z# D; m
    + V: ?; ~+ H! N" l& X6 X& ~
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    * S. @5 U" E- U7 V6 x2 _
      ^1 I) Q: ]4 @7 r- S0 ]8 x* |+ U6 o

    ( i8 r# g2 o2 ?, _( Q& ?* f0 a7 smatplotlib.pyplot.xkcd()简介
    ! l* n* n- c! V6 X这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小$ @  B9 W  I2 h" f% d

    # N7 G% V# K% P( W' v1 T+ t( I- x

    1 L' c0 ?/ Q, K0 ?' ^3 B' m) rmatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
    0 S  ^) I$ V& }$ _2 b7 e8 M                       length=100, #褶皱长度" b. y7 R/ d, t2 x5 a  |3 p
                           randomness=2#褶皱的随机性
    ) `; @; p* C1 r- J' x$ b                      )
    % G% v: V6 I1 M, h4 Dmatplotlib.pyplot.xkcd()使用
    # P& g0 @6 O4 W) g) B- W如下,加with行代码即可,括号中参数按个人喜好决定是否设置~2 v* }: K1 v: i, O/ w6 t- j

      S( x; `4 p: X. G

    + A. s" C% g& P9 {with plt.xkcd(scale=1, length=100, randomness=2):3 v) h8 c/ X  `& w# P# M+ ~
    #with是临时使用一下,不影响其它图使用正常样式
    ; C0 d9 c2 I9 l3 W5 T    绘图代码. B. B; F' d8 N: E
        。。。。。。, n0 W" K" ^7 h% x  P
        plt.show()
    6 x8 N7 A4 l4 u$ q8 \8 s! _matplotlib.pyplot.xkcd()使用实例 & z6 `- _' U$ f( I8 m5 L* k
    下面代码为pythonic生物人公众号之前的文章代码) n# l5 N' {9 b) o# q

    0 c' t" Z3 j. r9 Q8 ]/ q
    $ J* S' X: j+ z! V
    以下参考:Python可视化25|seaborn绘制矩阵图
    7 M) Y4 {8 |+ X
    0 P0 a$ W  m* ?# s' |

    * \0 F& _. x/ `: C) M#支持seaborn! D1 W4 {& g' K. @0 L1 E) H
    import seaborn as sns+ H! }+ X8 H$ |, w
    iris_sns = sns.load_dataset("iris")
    ! d* C/ Y8 D" Y5 Mwith plt.xkcd():* D$ {+ F9 J3 e' g- F- F( h
        g = sns.pairplot(5 w) ~6 K& C1 y0 y. U+ T
            iris_sns,
    : X& S7 x& o/ Y3 Q3 _        hue='species',  #按照三种花分类# `" @3 p5 C% k& R& y, Q
            palette=['#dc2624', '#2b4750', '#45a0a2'])
    3 O- v) s  e  D+ R    sns.set(style='whitegrid')0 W& [( Q. L! y; s
        g.fig.set_size_inches(12, 12)
    / o6 Z4 T( _. \$ P. d8 u1 X    sns.set(style='whitegrid', font_scale=1.5)0 N9 g4 |" \0 u" U
      
    * T! L, U) c; r" h2 j' f+ q% H
    + |9 m! u; ]$ V% w$ |
    8 C# v& Y# r* |# p! h
    以下参考:Python可视化29|matplotlib-饼图(pie) 1 s- K) T+ a! c' L" J
    " C. `( |, T, D  M) y

    0 t( C' A% {, P: v+ simport matplotlib.pyplot as plt
    # D9 t+ d1 c* t+ T! ^% p0 C) {( mwith plt.xkcd(
    $ e3 U# m+ Z* k6 @  o" K7 @6 s        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度
    # P9 u! P7 x% O6 P        length=120,  #褶皱长度5 V& P* ^) ?" `' n- b
            randomness=2):  #褶皱的随机性
    ; m, M! g9 f. A4 ^. m    plt.figure(dpi=150)
    # ?- {* @% L1 W, D    patches, texts, autotexts = plt.pie(
    2 P4 y+ @  a" `# |& F2 ~  p; t. p        x=[1, 2, 3],  #返回三个对象
    # s: s. t! h' `        labels=['A', 'B', 'C'],
    ! T) q: `$ n- |2 f# L5 e; M        colors=['#dc2624', '#2b4750', '#45a0a2'],
    2 _4 e! f6 E7 [6 O        autopct='%.2f%%',6 c+ Q3 J- [' A$ z5 S
            explode=(0.1, 0, 0))
    . M3 t) Q$ z3 a" c    texts[1].set_size('20')  #修改B的大小' D4 P, ]: j% @2 V% H- `# B9 Y' W
    ! }/ s' G2 P8 ^# E
        #matplotlib.patches.Wedge
    $ t  G6 Z# V- ~1 Q2 K# ]1 j    patches[0].set_alpha(0.3)  #A组分设置透明度
    ' ^+ l9 M% x4 E& w! M    patches[2].set_hatch('|')  #C组分添加网格线0 Y( D7 M. A. c2 m9 m; E7 `: [# d
        patches[1].set_hatch('x')) a* d: y. c- [, P( Y: Y

    ( ^- p- L3 d/ x: W7 b    plt.legend() B% y% |& {! d- Q& |- v; ^
            patches,$ P% S$ G6 N' A& \, t+ v
            ['A', 'B', 'C'],  #添加图例
    * o3 d7 ^9 J/ h. c        title="Pie Learning",
    ! H: m7 p4 I7 a# g        loc="center left",
    + e+ O1 ?" N2 q# Q) ]% s        fontsize=15," S' m! i4 ]/ _2 Z! V
            bbox_to_anchor=(1, 0, 0.5, 1))) f1 N& k8 U+ L* n5 x/ Q8 z; Q' q* o' ?

    9 A! h) @+ }' J% i" G' w3 o# u    plt.title('Lovely pie', size=20)
    2 H1 n5 t) z! H$ m5 a3 l2 w    plt.show()
    4 V- u/ A" z* P0 p2 F  F- l4 x7 e
    : _" t8 w1 ?" O
    # y) x/ [- l( Y; i' Y% s: E+ X
    - R, l+ ~5 c/ d4 O7 ^

    " W3 N4 A7 s; p& Z5 kwith plt.xkcd():- i8 A, f+ o" d# M; X/ Z; w+ E- C
        from string import ascii_letters5 L; z# V2 z. J
        plt.figure(dpi=150)
    7 ~& s9 g& }: a+ i! t    patches, texts, autotexts = plt.pie(7 F& h6 H9 e& A6 a
            x=range(1, 12),
    2 h- g8 a0 N* r        labels=list(ascii_letters[26:])[0:11],6 N4 e7 t9 P+ Q
            colors=[
    & O- V/ r  q" E; s9 A            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',2 F/ h- E. z5 J& \
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    ! q5 D" b$ K4 f1 ^4 f        ],
    0 a8 [( ?2 W' s% S! Z7 ~        autopct='%.2f%%',
    0 o6 F* a" @/ X- M/ E    )5 P- ?, e* A% i; k1 h4 |
        plt.legend(# [, y# D% O9 G7 ~- }! @
            patches,
    # u* Y% ]' W) I# S- P        list(ascii_letters[26:])[0:11],  #添加图例" S4 R: r/ }2 l  j% X% ~' n/ N7 P
            title="Pie Learning",& a$ x5 ?# g& d8 s; ]: T# p
            loc="center left",
    ! ?! `( Q& X1 w4 \: K3 d! q1 A0 k        bbox_to_anchor=(1, 0, 0.5, 1),' A, H$ g# M% K1 \
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,8 y  p0 e- `. H3 `* u+ D1 b
        )
    9 D. M3 D5 q- j6 I# Y2 M. S; ~: N. f) `' l+ e& L2 {8 K

    : p0 d8 V% E/ t' J; `+ x  O; w$ `8 R  s. J6 Y& E
    2 ]1 p6 ?! A5 t  G; \% C# v
    import matplotlib.pyplot as plt
    ' a, a0 f0 S( ^. Jimport numpy as np
    ! ?: U9 y3 J7 i/ \. s: ~with plt.xkcd():7 j2 W) l+ _  k# v. [- W( _' Q
        plt.figure(dpi=150)
    + q) r  O8 L' t0 l( Z    labels = ['Jack', 'Rose', 'Jimmy']
    ) X0 a; X4 I5 P* M* @9 ^    year_2019 = np.arange(1, 4)
    - F; T: X* }4 U4 T    year_2020 = np.arange(1, 4) + 1
    * Z0 ~0 B' v; \- _9 P% c, H. V  K. ~1 {    bar_width = 0.4
    * m0 z" Q; k# m% |6 f
    & r1 R; l/ S& \' H% d4 n2 ~' [    plt.bar(
    5 j3 r' c  V( n( g3 X& A2 T        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    / e. v% S" _9 G7 f' T' N; K% C        year_2019,
    0 W/ |7 x4 u9 {4 J) q3 I        color='#dc2624',. `/ _, E8 Y4 P8 @
            width=bar_width,1 [$ a; z" M1 a* S. G
            label='year_2019'  #图例, ^: q3 X6 B# @2 i8 @
        )( t7 ~7 A" l" d3 a: a
        plt.bar(( r9 c' O# j3 W+ S! V4 `! P3 c
            np.arange(len(labels)) + bar_width / 2,+ y0 Z1 D6 ^) A
            year_2020,
    % m4 Q) o* W: N( h        color='#45a0a2',
    ( B/ Z  N; d9 {" F) e/ c* S        width=bar_width,
    5 b* d# S; r) r& D2 k% B        label='year_2020'  #图例" J' f0 h: ~3 {8 h7 M' f
        )
    + B' o/ P5 i; y5 W) R/ g  j* L2 P' H    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称* g4 }* D, k# j
        plt.legend(loc=2)  #图例在左边- z7 X3 ]2 _+ H) |1 f
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 " w7 u& T5 U" V; Q7 J, u

    3 r! [( J) g0 o. U0 I+ o; R* d; C6 ~, s

    / k( d  d0 g& _  x' g) X
      u" T3 `- A7 X9 J# R' G, q. [

    # a. E4 x. b  v" _1 i+ r
    4 H2 g3 B7 z9 s0 [- X" [

    * R# R3 i, g0 i" X) `以下参考: Python可视化|matplotlib10-绘制散点图scatter
    * ?' J, p7 s* J3 c+ l; h& ~) |
      u0 e9 A  K% j, P, ~
    7 R( {7 |8 X2 O, ^
    import matplotlib.pyplot as plt
    - t  J6 z- j6 h& ~import numpy as np
    & f: D; S/ Y; a8 U. x' [import pandas as pd
    ; ~) v; ~* r. y7 l, S; h5 Qfrom pandas import Series, DataFrame
    , v% S+ s" e; }% ~8 W2 J8 a#数据准备
    + \- p+ Z3 j: {9 f( }from sklearn import datasets
    9 I. M; {, S* q5 X# }% K  Z4 `0 r+ R( b
    - Y. A/ U: z& M$ E. c' Firis = datasets.load_iris()6 _$ p( y3 ^+ K( u3 p/ H. p
    x, y = iris.data, iris.target# |4 ~9 h* _4 ~( O
    pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
    $ @& K- A; Y/ d4 `' ^: ]* O                       columns=[
    1 i% m  V) y9 x& T                           'sepal length(cm)', 'sepal width(cm)',
    4 V# V. ]0 g& p; x                           'petal length(cm)', 'petal width(cm)', 'class'0 r4 x! X5 u% y" q: u8 `8 ?& Y
                           ])
    2 T: y/ Y& B! B9 awith plt.xkcd():6 S( W" L7 m. y1 Q- u4 |
    / W+ L0 a5 k& }' W$ G
        plt.figure(dpi=150)  #设置图的分辨率
    % H- w4 H3 {: A+ u+ Q, [    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    ( L& v* Y8 {7 ?7 y- v    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类. _5 }- R$ \, M* m9 R# w
        iris_name = iris.target_names  #获取每一类的名称' {% G+ O; X" }* i) n' U
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色2 A$ b6 R: B) S/ F0 b/ _9 ]" @2 n
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形
    * X. M7 {9 W$ b4 p) ~
    + z  F7 X9 O- U" u1 ~3 R    for i in range(len(iris_type)):& C6 b$ |: F  S& N' u; p' D3 x
            plt.scatter(, ^8 e* N9 l6 F, m
                pd_iris.loc[pd_iris['class'] == iris_type,; o" K% w* L; R4 Y; _- g! H
                            'sepal length(cm)'],  #传入数据x' m6 _2 a$ g. F: F: ~/ Q
                pd_iris.loc[pd_iris['class'] == iris_type,
    # A; V9 n% S$ ?( C. @" y; A# f+ }$ M                        'sepal width(cm)'],  #传入数据y
    + F" N5 A; I; m# j" m            s=50,  #散点图形(marker)的大小6 |$ E) u+ H* ^* w* l
                c=colors,  #marker颜色
    : g- c. l5 f$ E% d            marker=markers,  #marker形状1 D* w% F0 ~# ^8 e1 D
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    + r( K0 X( Z5 {            alpha=0.8,  #marker透明度,范围为0-1# o9 I' r) p/ V( j1 A) P
                facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    & c. s/ S2 o# X( a0 l. w            edgecolors='none',  #marker的边缘线色( ^/ I; p7 ~( H$ S6 [8 S
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用. G, u/ ^# u: B: w7 D. {/ _* N  k
                label=iris_name)  #后面图例的名称取自label
    6 |) }5 I# M7 [* Z5 C ( k* x, M" r. @4 a: H' t
        plt.legend(loc='upper right')! B$ x  X% n5 m' ]) j

    5 w. l2 N( A+ [) N9 L  [' W

    / Q% S& l& B" d" `' c- D2 q, r————————————————
    ) v' l3 {& |9 Q& N- S2 T% P版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    % |& ^! F8 q$ M3 j5 Q; N原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
    $ [7 G% s: i' e$ |1 f7 c
    6 N' K& K6 G0 F7 R" w% O5 j- ^
    * S. j0 V. K3 K4 n9 }* k5 b2 N. r0 x
    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-1 17:11 , Processed in 0.418767 second(s), 51 queries .

    回顶部