QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6287|回复: 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 S; d  N( F. w0 D$ c
    一行Python代码有多强,可让图形秒变「手绘风」
    6 r2 l" x) |% [* |) ?6 l之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具! i% ~& n' O; q7 z( o  A* U
    / z, \# |. Y5 _
    * J+ H: X1 R; Y/ k* U  {' p
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    % m  Y2 e6 ~- d$ S6 |' w5 R2 Y2 |! t) \! V
    $ k9 \, X$ U8 k" G$ g# m7 s
    matplotlib.pyplot.xkcd()简介- T* c  X, X2 t% J3 J
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    ; Y% g/ r) e9 p2 E$ V  }5 p7 g. d5 ~9 }
    & B# a& W" c! M, y$ ~; c( u# E( U
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度, I& Y" z8 g' B1 h( Z8 T
                           length=100, #褶皱长度8 W" R$ v2 _( \- t- u
                           randomness=2#褶皱的随机性: I* r2 y/ }. d- u9 I, p- H
                          )8 J; Y) }0 i5 C4 {% `$ M8 p
    matplotlib.pyplot.xkcd()使用2 z) r. E7 m7 Q8 |$ l# G6 `
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~5 e7 ~6 |# ~4 C0 a. N" {

    * e: g2 X$ M* Y4 b5 `# |
    ; S) L: y8 s' F- l/ l
    with plt.xkcd(scale=1, length=100, randomness=2):
    7 |9 \+ H; g0 J1 v' y7 a2 H, H#with是临时使用一下,不影响其它图使用正常样式. i" ^: |; S% m; N
        绘图代码. B: Q1 N4 v& L# F5 w' V
        。。。。。。
    5 S4 G$ a9 u3 R" w; a    plt.show(); ^3 h$ k0 D5 q; e5 ^4 M
    matplotlib.pyplot.xkcd()使用实例 ; A3 S( `) ]. ?/ ^' B
    下面代码为pythonic生物人公众号之前的文章代码  P( G' H2 F  {; @5 ^
    9 h8 |( }5 g. P8 {  @

    # z4 [9 ]% ?9 F* i7 S8 z& q以下参考:Python可视化25|seaborn绘制矩阵图, a; p/ `) T( M" m1 F

    ( z! w" Z5 y8 o3 B$ P

    , S/ ?! N$ x" W. G. H8 B#支持seaborn
    % Z5 F2 A! n- Simport seaborn as sns
    ! t8 w1 F+ [' Q+ I% c/ l$ c; A8 Niris_sns = sns.load_dataset("iris")
    $ d: _0 F% O! B; Bwith plt.xkcd():
    * b' x' H! k% J/ ]7 ^    g = sns.pairplot(! d- y$ }0 J, j' y! R0 F" d
            iris_sns,$ F; R# T$ G& V/ S
            hue='species',  #按照三种花分类# U: h* n3 x# D
            palette=['#dc2624', '#2b4750', '#45a0a2'])
    $ M5 G3 T  j+ w/ w* @    sns.set(style='whitegrid'). u/ _* E$ L5 X( o' M- i
        g.fig.set_size_inches(12, 12)
    6 m+ U- [5 ?# A; x$ P    sns.set(style='whitegrid', font_scale=1.5)
    5 _" x" Y; S5 T( }  
    6 [3 g5 h1 \, b: f; M9 u; [+ B5 f  e8 p
    ; {& z, H$ F4 v; n
    以下参考:Python可视化29|matplotlib-饼图(pie) " G* ]- |( N9 n9 [6 \, ~! X$ K

    . d8 u* o( P. I- B! f
    - w4 Q# J* P- s4 y7 E# ]& ?7 }0 x
    import matplotlib.pyplot as plt
      X# y& v9 j0 ~$ Pwith plt.xkcd(
    . r7 z" ]; l* [3 {. }        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度, N0 ?0 H; ]' ]% ]0 p) W
            length=120,  #褶皱长度
    ) ]) T% b  g" w        randomness=2):  #褶皱的随机性6 e5 a# e8 l: Y: W: @8 L8 {
        plt.figure(dpi=150)
    : C% S8 X7 b2 K' p    patches, texts, autotexts = plt.pie(7 b* U" H  c+ ?! j
            x=[1, 2, 3],  #返回三个对象/ S6 |; _3 c8 R% ^3 u* ?3 f% P2 k
            labels=['A', 'B', 'C'],
    - v2 O" Z$ ^6 R        colors=['#dc2624', '#2b4750', '#45a0a2'],
    7 K5 [/ s! B: a+ Y  J        autopct='%.2f%%',- M9 c" Z2 d. h7 [
            explode=(0.1, 0, 0))  Y% P# [/ E, V7 }7 L, u4 V9 r
        texts[1].set_size('20')  #修改B的大小
    - X: a, E2 c2 {. a
    ' Y: S1 v7 ^" U! d" p    #matplotlib.patches.Wedge
    " S+ g! Q: d6 Z; V; ?+ C' D    patches[0].set_alpha(0.3)  #A组分设置透明度$ @5 f# {' p! r
        patches[2].set_hatch('|')  #C组分添加网格线. F' X  J2 I; c! |3 c$ R
        patches[1].set_hatch('x')3 j) B' M+ ^# a$ Z( U4 F+ k  l
    , Y. t8 s( C% A! b% r4 L# p9 ^- s
        plt.legend(
    + R+ N( S- `- @2 w        patches,
      h  \0 y/ ^- w; _; M6 r5 z        ['A', 'B', 'C'],  #添加图例
    * u% I( }! {( s4 x        title="Pie Learning",
    : Q  S! F$ D. V2 i4 f        loc="center left",
    : q- x% I3 _- ~: C# I        fontsize=15,
    % p- T4 `& w2 G, h% B1 T        bbox_to_anchor=(1, 0, 0.5, 1))3 A) j, |8 ]4 a
    % R+ d- F( [3 j0 F4 [
        plt.title('Lovely pie', size=20)
    : z9 q  \; o/ \  o$ D# K. r8 U% U    plt.show()1 M. z' l6 v6 S3 @, ^$ T

    # S, B- i2 l' r/ Q. K* p
    6 M8 F# F8 n$ y
    : Z8 m0 V) C# ]2 Z3 H
    - U0 I4 P' C( H% l0 n4 j
    with plt.xkcd():
    % A0 @% D4 {0 T7 ?- [0 v/ P0 z: S    from string import ascii_letters
    , h  j* s, ]! P6 ]8 x. G    plt.figure(dpi=150)
    3 N7 g! Q& p, ], e    patches, texts, autotexts = plt.pie(
    2 c4 |0 ]& q' R  R" K# y        x=range(1, 12),2 w3 \8 M/ a+ v# u
            labels=list(ascii_letters[26:])[0:11],7 H$ f3 ?1 S5 @- R' k/ _% T
            colors=[$ O1 c& o& z5 }4 |5 H
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',0 g' B/ y; s: t4 \1 J$ A
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'8 [1 @: Y, ]' F* B
            ],- @8 y$ t& p7 }$ [( G/ y+ {  d5 q( j
            autopct='%.2f%%',! D: Z+ ]$ \! M
        )
    0 J$ ?7 n/ N: W# w    plt.legend(8 |& Z1 `; G% B9 P2 U: |
            patches,+ @# @: X5 H1 W! A
            list(ascii_letters[26:])[0:11],  #添加图例
    % m8 v& B8 e* X  t* T: _- S" G        title="Pie Learning",0 F7 L+ q9 T) u; B$ F' e
            loc="center left",
    0 V1 C8 a6 |5 M  z& R2 F0 L, J        bbox_to_anchor=(1, 0, 0.5, 1),
    ( @- b) b7 ~+ v& o8 ~6 W5 h" }* Q        ncol=2,  #控制图例中按照两列显示,默认为一列显示,
      @5 k9 w5 o1 [# V    )
    4 J! e2 Y# ]0 I9 R) q; d
    ! g# z- T9 F9 S, R

    ( b+ y5 n7 V1 y8 e/ v# ?! t7 v) d& ^" |* @$ O
    & j) k6 f3 a: n( M2 J
    import matplotlib.pyplot as plt
    6 t0 l0 k/ z- N% ~import numpy as np' s+ Z+ B9 L* Q% W+ }. V& c
    with plt.xkcd():
    . }* Z0 f$ z8 K/ e    plt.figure(dpi=150)6 Z- M. S7 H4 n+ j* a: j
        labels = ['Jack', 'Rose', 'Jimmy']
    ' n7 n3 D1 @' O- N% n4 l0 u    year_2019 = np.arange(1, 4)' Z% p: H/ R' s( b
        year_2020 = np.arange(1, 4) + 1. I# j  A; z! f  l6 V' M
        bar_width = 0.4# F# G$ U; t3 u! M9 d
    * e% i+ a! l* o
        plt.bar(
    ' c" T# m) {. W7 Q        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽/ B, k8 {3 u$ ]; b
            year_2019,
    0 Z5 x/ t: T( `6 X2 u/ {        color='#dc2624',. Z$ r" k: O7 u/ Q& V& M
            width=bar_width,' z8 Z8 {; t. F$ y8 N( |' ]
            label='year_2019'  #图例
    6 Z( N4 z1 K% c# H! z! L    )
    5 t: W: j4 G! k: L1 `, R( H    plt.bar(
    1 G5 {" f8 d9 k        np.arange(len(labels)) + bar_width / 2,
    : ]# Q9 o* P$ I8 r8 K3 L        year_2020,( @- r+ c8 W# r! g; X9 k% R  m6 z+ P; j2 V
            color='#45a0a2',4 N- }  `/ M! U! L
            width=bar_width,
    4 H7 r( b: @4 |& C        label='year_2020'  #图例+ c8 N# ~6 e8 m% u; V- c
        ), B. b6 D7 T+ ~* M
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称
    + q7 `7 S& d5 a, m1 Q! r4 Y    plt.legend(loc=2)  #图例在左边
    % I8 Q- U. x2 q以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 $ K' y! _4 G8 e6 y
    ; C: s, C& H# `

    * ]8 E+ J" t1 Y4 F
    6 x4 H: L& X; b: t% {

    1 W/ s. e4 C( U/ H
    1 o* i$ V7 S  V& r
    % y1 Z" V5 w& ^6 U
    以下参考: Python可视化|matplotlib10-绘制散点图scatter
    9 i3 S" k9 v; Q6 c) U  W2 L' _+ _  \! j
    9 ]# E) w- o4 Y9 {6 F5 y5 j. p
    import matplotlib.pyplot as plt
    + a# f$ O# `7 r( T  Yimport numpy as np
    6 n$ o; d  |( o0 Kimport pandas as pd
    7 n: c4 Q- W) q. q8 |( B8 \from pandas import Series, DataFrame
    ) f  k: d' z9 C#数据准备; _/ r( p, j( j, m  ?. ?- }
    from sklearn import datasets
    8 ]& E7 U; S' f' W 8 t2 u( n8 [( M4 q' G
    iris = datasets.load_iris()1 D' t2 S" Z$ J0 l) M" T5 S
    x, y = iris.data, iris.target
    % z: D' n) x( m; W- Lpd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),* I! y. K; w& S2 I
                           columns=[
    4 Y# e5 i& l5 l% J1 x- I  F, l8 x  V3 u                           'sepal length(cm)', 'sepal width(cm)',
    ; Z0 K4 g8 m# i% V7 W$ @                           'petal length(cm)', 'petal width(cm)', 'class'
    4 P/ n# X) d2 d+ T$ F1 K' Q0 E                       ]). L9 l3 `1 F3 |3 \4 q1 O9 ]
    with plt.xkcd():
    + r- y8 I& P& E" C 1 V. P- E  m+ F+ [. }6 E2 @3 ^
        plt.figure(dpi=150)  #设置图的分辨率8 [& p  ]6 `! A, O9 @; a$ ?
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    / D# M5 X" p# {% A    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
    # C+ d, V5 e, K% ?" X% Z    iris_name = iris.target_names  #获取每一类的名称  s6 Z/ c6 M0 Z, w. [6 ^: d  ^# K5 g( f
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
    , g! ]. w- v: N) t& _    markers = ['$\clubsuit$', '.', '+']  #三种不同图形
    ! r/ {! o- A8 \0 x1 n* T3 z3 _ ( r2 V- H5 H% r0 K) C
        for i in range(len(iris_type)):6 |3 y% B& }2 V
            plt.scatter(# {0 ], v  G9 m# u* l; ^
                pd_iris.loc[pd_iris['class'] == iris_type,6 `" h# @7 j/ o) b' s" ^" J
                            'sepal length(cm)'],  #传入数据x
    1 @) d- N1 j0 u% R: ~- d  X            pd_iris.loc[pd_iris['class'] == iris_type,3 A- |6 `8 Z3 U* l6 M
                            'sepal width(cm)'],  #传入数据y
    3 M' h! t! l) j" d  n  F9 Y            s=50,  #散点图形(marker)的大小, Q0 ~2 L3 t  N
                c=colors,  #marker颜色
    & @0 O3 ~: u7 x            marker=markers,  #marker形状- U1 G) T, A, C! V6 `. B+ s
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    6 B6 n$ L$ a$ I            alpha=0.8,  #marker透明度,范围为0-1
    0 x6 h' p5 G1 h+ ?4 F, |$ d. w            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    : d' q" l9 z# y- f& @            edgecolors='none',  #marker的边缘线色
    * e: |" W  N. F9 h6 t6 R" |2 T            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    . {/ o& H! L1 L# s' b2 b7 H            label=iris_name)  #后面图例的名称取自label
    2 L" r" \+ ~& D+ S- D # F& }' {( G7 n, K( ~% M
        plt.legend(loc='upper right'): }0 }8 `5 Q- _
    7 d  {( E8 v$ [. [# d1 b

    ! f7 B% y1 J$ U2 J————————————————
    . X0 b* f& y* O7 e: E$ W" p3 i版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    8 r* ]0 X) Z3 X6 e原文链接:https://blog.csdn.net/qq_21478261/article/details/1189637533 ^2 _* L: D5 b) N, q6 s: p+ M
    $ a0 O. u; ?& J$ [/ y2 [
    5 K$ O/ @3 y: K9 q3 W
    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 20:07 , Processed in 0.392178 second(s), 51 queries .

    回顶部