QQ登录

只需要一步,快速开始

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

    ) Z4 |0 [/ A, e! d, Q一行Python代码有多强,可让图形秒变「手绘风」
    ( g  A$ y/ X& w! n! H( x5 F4 u之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    / C4 F$ L& d# S7 R  H
    0 i, u# t7 v/ }% z, M

    - `7 `2 x9 F- G2 X但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。" W( \) ^/ C2 G7 E* p# `7 f) ~
    . T+ z  q5 h& q8 o: I9 g

    4 |: J9 \5 R3 A# @5 imatplotlib.pyplot.xkcd()简介# [% Z3 {) u# K2 M
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    ( {2 j7 K+ l- u9 P7 V" `
    0 d0 K1 Q9 G, J% U% w

    ( o9 h; m7 B/ _# C6 K8 Umatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度; Q6 j2 R5 o3 h0 q* i
                           length=100, #褶皱长度
    ) \; O* p! s4 l  n                       randomness=2#褶皱的随机性
    8 T8 k0 f( `7 z. m% S8 ]% T                      )
    - a* @# `+ `& Ymatplotlib.pyplot.xkcd()使用
    8 [+ l' ]  O$ j0 E1 z2 e) {如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    % q$ G, d4 @/ _" Q3 c- r  u$ M# G$ D, b! F: K

      v" E! L  U9 C" i  Lwith plt.xkcd(scale=1, length=100, randomness=2):4 P. e" f$ K' E0 z0 v+ q5 D. b
    #with是临时使用一下,不影响其它图使用正常样式7 l; s8 L4 D! f$ v7 o
        绘图代码" h% s! E4 P; O; o7 ?) W* p
        。。。。。。4 C8 j* B; Q: i
        plt.show()
    + a4 c# z7 ^' S: \& |) Y9 smatplotlib.pyplot.xkcd()使用实例
    - I6 ^- I+ v* d  V/ i- U- B5 }6 }下面代码为pythonic生物人公众号之前的文章代码
    ! k& F. V- w# ]' T6 `. C# ]+ i+ J7 G3 {" M) F) P
    : ?' V( g& [2 _5 P  v- I* c3 m: D2 k
    以下参考:Python可视化25|seaborn绘制矩阵图
    * d  y$ T$ f5 q5 c1 {& U6 ?& n3 |
    6 @0 O% ]& h* _1 N. \

    , B0 i) k# N1 D8 j* Z#支持seaborn
    / ~: g# z6 f! z" Y0 D9 y! L6 Aimport seaborn as sns
    $ |) I! s0 C' I4 \, F! N7 m7 uiris_sns = sns.load_dataset("iris")) y; Y1 w4 C; n7 O& w, P) T
    with plt.xkcd():2 i! {7 a/ N9 s) B# h+ t
        g = sns.pairplot(
    % z0 o! k* Y5 A        iris_sns,, u  X" ?/ m. k$ `
            hue='species',  #按照三种花分类
    ' o) e" M2 d: C% F. \6 b- C        palette=['#dc2624', '#2b4750', '#45a0a2'])( ]4 M- @. ]5 v
        sns.set(style='whitegrid')
    $ J9 b/ p5 d1 }% D( K+ {3 o    g.fig.set_size_inches(12, 12)" N# D4 ^/ ?) Q- J
        sns.set(style='whitegrid', font_scale=1.5)# n1 |- c. L1 ~* v4 [
      5 o6 T; v8 |4 D/ n
    * \$ W9 l8 p. ]. ~# f! V

    & K- R. n7 @* w3 P以下参考:Python可视化29|matplotlib-饼图(pie) ( ~1 m0 `7 D; X9 ~

    . w3 l: N1 |* @$ y/ F" i

    / m+ k. e9 r4 k# pimport matplotlib.pyplot as plt
    ! A. ]% \. H  b1 I) z: Dwith plt.xkcd(" p5 H3 F2 U! Z1 v. [
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度4 @  U9 Y7 w$ e
            length=120,  #褶皱长度4 l9 g0 P" x1 e3 V# c6 c
            randomness=2):  #褶皱的随机性! p9 u" I- H* p) u9 \
        plt.figure(dpi=150)7 g7 [' u8 F; y- q% z
        patches, texts, autotexts = plt.pie(9 v* I/ U* |( F9 f" D
            x=[1, 2, 3],  #返回三个对象7 g6 t. t8 l/ ?/ b. l9 I& m1 v7 w( d
            labels=['A', 'B', 'C'],
    & u2 M" t5 K2 g$ e4 C7 T        colors=['#dc2624', '#2b4750', '#45a0a2'],/ g0 v0 {- P% Y, H5 N. T$ b4 f
            autopct='%.2f%%',
      Q/ k! q9 v, x8 ?+ E7 P: d        explode=(0.1, 0, 0))
    ' U# u1 \& A1 y7 m9 R2 W    texts[1].set_size('20')  #修改B的大小7 q" G2 d* y" H( ?( r$ P
    . e1 i4 s( q( X
        #matplotlib.patches.Wedge
    + Y4 T! h, F! \5 w6 l  [% \    patches[0].set_alpha(0.3)  #A组分设置透明度! V4 E, O7 |* G6 S: n5 H$ N
        patches[2].set_hatch('|')  #C组分添加网格线
    5 P# r2 J, c' Q' H) V7 I9 j    patches[1].set_hatch('x')
    - P( {- _* A/ ]# ^8 n6 T " U3 I8 c: F! z' H  n9 |
        plt.legend(
    ! u! S, v& I( q$ Q        patches,- Q9 s9 b7 K) o/ f6 T* T8 J& u
            ['A', 'B', 'C'],  #添加图例: [( A5 u$ G* Q+ Z- i$ C% _, L
            title="Pie Learning",
    1 P* S5 V# i/ V5 {2 j. d        loc="center left",
    8 ?9 h4 N, x0 M% W- u3 e* g        fontsize=15,/ D5 W) Z1 w+ j2 O' T4 W3 N( T8 y) o
            bbox_to_anchor=(1, 0, 0.5, 1))( l3 b1 G% Q! d
    / g4 W, V6 c) C5 x, B
        plt.title('Lovely pie', size=20)* D8 {6 a4 }( N
        plt.show(), e! e$ r  J/ Y# @4 w

    * r6 w; W. e! l6 W$ c3 R
    " \! [% y. `9 n  o6 J

    , e. y- t7 ?: ~# E: o% u( z6 [
    . o/ }/ V( I) C, x
    with plt.xkcd():
    4 b, @4 g% }" [9 v3 B  c    from string import ascii_letters
    2 I! B& b; d+ U- q! b/ Q    plt.figure(dpi=150)
    . ~/ X/ ?, r1 Y& \    patches, texts, autotexts = plt.pie(" d9 P. r0 Q* T" M+ M
            x=range(1, 12),3 Y& N2 s; Z1 B- v  R* N
            labels=list(ascii_letters[26:])[0:11],
    # S1 H6 p" j2 o, m- V        colors=[) t7 u" o0 c9 [* t
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',& o% K. s1 U3 }% V- m
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    ) I0 n- [3 F: P        ],
    9 f0 I2 v# H5 x- C2 I1 d* b. p        autopct='%.2f%%',: j. t2 x5 J, Z& L* }- P
        )
    8 l  E: ~/ E/ E1 Q) x# ^. g& t$ X) g$ ~    plt.legend(
      i; w) l9 D2 q! y0 E        patches,& I% O: k7 k4 e1 I
            list(ascii_letters[26:])[0:11],  #添加图例
    4 {, W- T. N$ e( e2 W        title="Pie Learning",7 q; a, C8 ]8 B
            loc="center left",
      l3 ]* N: B2 ~5 ?; ]        bbox_to_anchor=(1, 0, 0.5, 1),' x6 M5 W) ~, r; g4 W$ a( ?
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,3 Z  j0 e" b4 O- ^
        )3 `0 A* }' D' r/ B1 j; a! y. r$ b, K
    9 C5 l% }5 F% G$ [+ L' O
    ( M3 i: Y) N; s# G( C1 U* W

      [+ ~1 o# ~& f" u3 _9 @6 E

    ' Y; v: n9 y$ {import matplotlib.pyplot as plt
    # y3 R; o0 X) u# Q  ^import numpy as np0 W4 y+ i* Y! h  }7 V
    with plt.xkcd():
    " C8 U: T# }" ^) M5 Y% d    plt.figure(dpi=150)  l7 }  B- }% h5 O
        labels = ['Jack', 'Rose', 'Jimmy']
    ( ^+ Q) K6 D9 I    year_2019 = np.arange(1, 4)' r8 H1 @4 W+ }! |
        year_2020 = np.arange(1, 4) + 1
    : C0 ~* m) v- P1 J+ J    bar_width = 0.4# S9 v. I! G# d: l- }& e! G. f

    * f  S5 O5 {6 L: s* Q/ ?    plt.bar(  g, P; _/ K$ x' X: @2 E+ Q
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽6 n) V% E% r2 ^* Q% I7 f
            year_2019,
    1 l% L8 G) ?% }        color='#dc2624',
    + J( }, a& Z' P4 o        width=bar_width,
    # u8 F* `* D! t0 ~# r, B        label='year_2019'  #图例6 M9 n- v) {2 k" |' ^* Z6 K
        )7 V9 o  _% B3 ?/ M
        plt.bar(
    % s/ G4 S6 @  A7 |/ l2 w+ V        np.arange(len(labels)) + bar_width / 2,
    ) y0 F/ J! ]" W8 j; |# Z/ |        year_2020,4 l: a2 ^2 [! N0 G3 s
            color='#45a0a2',9 F( }# o- p* ~$ r! l# E3 r
            width=bar_width,9 Y$ J' m3 U  f1 n* ?
            label='year_2020'  #图例3 G: ~2 c% l3 k3 f# _  T
        )2 h- h4 c+ p# ^6 n
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称& G7 J: }3 p/ U. ~
        plt.legend(loc=2)  #图例在左边: m7 ?8 n. o) W; |
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
    : ]* E/ E* G6 R) R' X- l0 F
    ) }+ [( b5 d4 @  y
    1 O( v2 r3 b: I. s' G6 J

    % t8 {& @# L6 p6 f( X; W$ l# c
    7 E5 O! B1 G5 f$ s6 y- i

    ! Q% P  l& j# z) a/ P- P5 s
    0 F4 G* a' e' j% u* |4 I; Q% ?
    以下参考: Python可视化|matplotlib10-绘制散点图scatter
    2 }$ K1 m2 n4 S
    # L* m# n! Z& A6 B& D
    % b& R( u2 H( x7 U
    import matplotlib.pyplot as plt
    1 `8 B2 F: J/ A  h* m+ nimport numpy as np
    + p; n8 v! }' R( E! yimport pandas as pd! h* O! \+ `5 t. s: t
    from pandas import Series, DataFrame. `/ B/ D5 H- P# D0 X( m0 `
    #数据准备
    ; _$ K, h, n# m3 a1 W2 A3 Afrom sklearn import datasets6 e( _* E2 l, p- M6 K! g7 g

    4 j5 k& E3 v4 p, z8 i. E0 Liris = datasets.load_iris()2 h8 i4 m7 s7 {' Q
    x, y = iris.data, iris.target1 ]5 W' Q6 R& Q- I
    pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
    0 P  I+ `5 Z5 z5 s0 [- x  `7 ?                       columns=[) Q  p- F2 W; V0 Z8 c: g& P
                               'sepal length(cm)', 'sepal width(cm)',
    1 H7 I; e" P: A; C7 q. I1 I                           'petal length(cm)', 'petal width(cm)', 'class'
    6 N0 M2 x& H$ j) k                       ])
    , v1 p. y  u; I% w- Zwith plt.xkcd():/ r/ X' e4 C+ P4 d, \6 E% w- s
    ! o4 m' Z% w8 h, h! g
        plt.figure(dpi=150)  #设置图的分辨率
    ! m/ @3 v& E8 K2 v    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图& N9 P9 y) y/ l9 B% P$ V, x
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
    $ U" L  d8 f' V- _2 C" \/ o    iris_name = iris.target_names  #获取每一类的名称3 Q* b" p$ ?4 R/ r3 v
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
    ( V: }' }  a$ B( G9 x    markers = ['$\clubsuit$', '.', '+']  #三种不同图形
    : A) k6 c/ ^- A: s" {" A
    5 X8 O( D; y, C4 L+ W+ }4 ?, c    for i in range(len(iris_type)):
    : `; V# R' C+ Q! r; @        plt.scatter(
    " }% e; q- ?& z" z            pd_iris.loc[pd_iris['class'] == iris_type,7 i9 ^2 O- l& `- `- }* |
                            'sepal length(cm)'],  #传入数据x
    1 v( h6 {$ y1 J  y& z6 r2 q            pd_iris.loc[pd_iris['class'] == iris_type,
    / O/ N) s& Q+ F. U& t; Z                        'sepal width(cm)'],  #传入数据y
    / Z) A# }! i# q2 ^  \3 d            s=50,  #散点图形(marker)的大小  N  c! ?& `. y8 o
                c=colors,  #marker颜色
    . ]: P( w- `% I1 F: Z  {5 _            marker=markers,  #marker形状4 F  t5 y5 g. |( z3 C
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    : \2 f* R3 V6 W! h1 x. R9 @            alpha=0.8,  #marker透明度,范围为0-1
    : [# c, i- I1 h) k            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    ' @, v/ m0 `3 t            edgecolors='none',  #marker的边缘线色/ O. Q. ]2 |$ Y6 j" s! N$ Y
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    # p' l' e4 {: e! m2 k            label=iris_name)  #后面图例的名称取自label0 B2 s% D5 j3 x8 @& u

    " J  M4 d% I. L( z    plt.legend(loc='upper right')) q" q$ S8 h9 s! n
    ' p: b! H% P+ R' n9 n2 A! |
    ' Z8 Q( E+ k! U) W  P, I8 o
    ————————————————  u; S: \7 P2 @3 y) E
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    " w8 M! Z* V% p& s原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753! T! o( O" f+ `9 X" c0 t
    1 I/ i& @- S) O1 l* o6 f1 Z

    ! y( e' m0 o/ A8 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-4-18 08:38 , Processed in 0.285720 second(s), 51 queries .

    回顶部