QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6226|回复: 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
    & K) K  V1 t6 T6 B2 k8 Y3 P
    一行Python代码有多强,可让图形秒变「手绘风」2 }& k/ h; c* @) a( ^6 c) u
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具& K6 _4 K) ]! g" ]' l; Y/ t& y
    ( `  p+ {4 q+ Y; I$ Q

    , g( [* G* ]' f! G5 _, {但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    8 p1 f+ O$ V' y% F; @
    3 p+ Z& f. ~1 r7 G, S6 S/ U' ]
    / U6 M. @6 v, q4 I) [# O
    matplotlib.pyplot.xkcd()简介
    ) K: d, ?5 i4 ]这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    ! g. T$ A9 E' t: s0 P( Z- `- I( y. ]* `. O- Z

      F$ F3 U" N+ d9 m( g1 Z, rmatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度9 H, L; {, w9 V; m. l7 B
                           length=100, #褶皱长度+ I) x3 W1 v& i2 a$ j
                           randomness=2#褶皱的随机性4 r- M' z9 w  d) o# j
                          )! `/ g# A1 V% }
    matplotlib.pyplot.xkcd()使用
    5 X' a/ j7 Z; m  n4 D1 j" Y: U如下,加with行代码即可,括号中参数按个人喜好决定是否设置~& V, l' F6 c$ @

    3 I. r* _' m# M) q. \/ G

    & v5 H- v+ |8 Y0 s: Awith plt.xkcd(scale=1, length=100, randomness=2):8 O4 h& z# U& ~7 ]
    #with是临时使用一下,不影响其它图使用正常样式
    4 J) m4 V9 Q' l, G- `/ d0 m    绘图代码! z; c( n4 y. Z3 Q3 r+ w, Y
        。。。。。。
      F* G/ S9 l; C% b    plt.show()
    2 Y% c9 @9 C. _1 \: O2 Qmatplotlib.pyplot.xkcd()使用实例
    / U; V2 h$ n! N+ O( }, X; @: k) C9 D下面代码为pythonic生物人公众号之前的文章代码
    0 R" O6 B8 x! F! Y& s7 E! |
    $ b( Z: l" [* v3 j4 B- M& k
    & M3 v  J% B; P& r; Z: L
    以下参考:Python可视化25|seaborn绘制矩阵图7 ?/ v8 C7 w! o9 L  c
    2 ~- t3 Z' b1 W: L- f7 S/ W

    1 D, m$ K7 r: H/ S& S+ l- }#支持seaborn
    $ y) p; G/ S4 q# _! c, P6 g# bimport seaborn as sns
    6 s2 T2 Y  D4 c/ I7 ]# S3 tiris_sns = sns.load_dataset("iris")
    - q9 @/ k( l6 R5 Qwith plt.xkcd():
    8 |1 ~8 r. }3 t% L7 @! [* t8 q    g = sns.pairplot(
    3 w0 a7 I2 ~5 j- j        iris_sns,
    7 ]9 @/ z) K, g9 E" r. U, U        hue='species',  #按照三种花分类4 C  h* x; V8 m3 g& ?% E! A
            palette=['#dc2624', '#2b4750', '#45a0a2'])
    9 p3 ]# b* W! H    sns.set(style='whitegrid')
    # @" v6 U0 ]: @) }* F, x9 |* F    g.fig.set_size_inches(12, 12)/ M" J0 W/ A3 L4 {, W" p* @$ R* Y
        sns.set(style='whitegrid', font_scale=1.5)
    # y5 c5 Z, ~3 R' `1 B) c' r  * A# j2 I( `. H$ a* w5 x

    2 s+ X! @+ y1 }6 c
    . h, O5 R& d: d9 w0 X4 T8 D
    以下参考:Python可视化29|matplotlib-饼图(pie)
    5 n' }' s+ q3 p7 B* Z1 s9 K( c5 t, _* Q
    - U+ d8 l. E! ?( B3 _
    import matplotlib.pyplot as plt
    8 D- e2 _" F" D1 I4 v; h+ [; pwith plt.xkcd(
    + H: V2 Q; e% g/ R3 I! D, P        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度# y4 F" F1 ?& Z& K5 F# P- {; _
            length=120,  #褶皱长度
    , E! `' [+ P: {$ P. C9 Y        randomness=2):  #褶皱的随机性
    3 L  B% y. W  K/ p8 n$ H4 |3 c: H    plt.figure(dpi=150)
    ' X% D% M' C$ X    patches, texts, autotexts = plt.pie(0 q# F) j, k# K
            x=[1, 2, 3],  #返回三个对象
    ! d) h% E" k+ L" n        labels=['A', 'B', 'C'],
    % V8 x: h0 D. Z' N) S        colors=['#dc2624', '#2b4750', '#45a0a2'],8 e8 d$ y" ?% }( C0 I
            autopct='%.2f%%',
    3 H' O( v3 m. a& {9 ~' a        explode=(0.1, 0, 0))' D+ W, D3 N9 w  k
        texts[1].set_size('20')  #修改B的大小& z* ?0 w: U! I6 {$ l" X

    . h  a7 m& `3 c" h8 R$ v" L" H    #matplotlib.patches.Wedge! l9 @+ L' t4 C) U& G
        patches[0].set_alpha(0.3)  #A组分设置透明度
    3 k, |  r( F8 R, h4 G3 S5 G    patches[2].set_hatch('|')  #C组分添加网格线4 t% C- H4 a( a4 m3 v4 m1 p2 c
        patches[1].set_hatch('x')
    ! h" O2 `9 @1 {5 \ % G$ `1 O" Z) H' @
        plt.legend(
    $ g7 r2 h; ]+ w        patches,* A) v3 [/ [( L: [9 Q# F8 S- y
            ['A', 'B', 'C'],  #添加图例
    ' F4 ]% Q3 C; E- S        title="Pie Learning",' B8 x7 b" G) @  K
            loc="center left",
    4 c& G9 n4 o2 X& ]% `$ Z        fontsize=15,
    6 B; _0 {8 h' d0 [        bbox_to_anchor=(1, 0, 0.5, 1))
    * F$ p' o( E; y" |  ]9 E! h 9 m7 Y9 l- V8 |5 _. d
        plt.title('Lovely pie', size=20)* K2 ~% m. W- H/ S7 a
        plt.show(). K" k0 d9 ^3 ~4 H6 _* n! Y( L9 m
    # T/ S- B" s$ x: V- a
    : V8 l2 b7 T4 {: i& l

    7 ^( M7 g6 G/ v5 r

    ' M5 q% X# i5 a; Dwith plt.xkcd():
    * C! o- ~$ r" ]    from string import ascii_letters
    - r6 V" y$ o, s7 O    plt.figure(dpi=150)9 D0 ?- c0 W! l1 c2 }: X1 G6 G
        patches, texts, autotexts = plt.pie($ m! A  H0 y8 K7 r' ~3 F- b$ J# t
            x=range(1, 12),
    % R- }/ U0 w; A        labels=list(ascii_letters[26:])[0:11],1 \0 t, m1 b0 e2 T  V) G$ l
            colors=[
    1 ?1 z+ F1 I  }) f( s' s: N            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
    7 ~6 @1 `$ B) r% |' H+ i            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'3 ~0 w5 |; B( ?  j
            ],6 Q' o4 o2 V& D) c7 s& Q, |
            autopct='%.2f%%',' S. X& V6 X- P
        )
    ) L1 S3 v# W% \6 B    plt.legend(
    1 X& W4 B8 I% c2 Z+ X! H        patches,
    $ P" p$ U1 j" \9 I5 G" H' u        list(ascii_letters[26:])[0:11],  #添加图例
    & T, b: O0 Q7 F7 r+ M; F        title="Pie Learning",0 c; e3 L$ i" u9 ~1 H
            loc="center left",
    # z3 `( ?0 e: O+ T2 L        bbox_to_anchor=(1, 0, 0.5, 1),. L% H: i: O& Q6 A2 R, y- K
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    6 S) Y# @/ ]1 p4 Y0 d    )2 r* h; S, p9 n) H0 M. R) Z

    $ V7 j* |* h* p! B  s

    - [; T& r7 e- F# P' G1 l# v- R  M3 k+ |* h  a/ T! O

    9 R, u: y! X- f) |, O3 himport matplotlib.pyplot as plt
    & j6 g1 d* o9 E$ iimport numpy as np
    , L8 M" _' h: C3 Z7 o# v5 o- Jwith plt.xkcd():
    ; F5 M6 U) m4 w% k    plt.figure(dpi=150)6 b9 T) U0 a% j, o) _7 W& r
        labels = ['Jack', 'Rose', 'Jimmy']% `2 Z+ W) [3 v4 o
        year_2019 = np.arange(1, 4), n+ ^  t/ K5 n) X
        year_2020 = np.arange(1, 4) + 1
    # @! m. O  Q5 ^& ]! e8 w6 B    bar_width = 0.4
    " R9 B3 u2 V; U- N* ?
    6 k6 ]0 @# O+ r+ A    plt.bar($ u" Q( t/ D. n+ Y6 ^  N2 R
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽" z  v& p, m* [  x. q0 A7 A
            year_2019,6 a1 _3 S1 }0 z$ H
            color='#dc2624',
      v% K+ a9 q1 Y; Y6 O. u- [8 c        width=bar_width,
    ! S: `$ v+ o! e0 l        label='year_2019'  #图例; u9 n' e+ }+ |
        )
      `3 [- C$ p5 b0 ?+ I  S) t    plt.bar(
    % w! Q4 E/ i$ t4 F5 h9 X: S        np.arange(len(labels)) + bar_width / 2,* V1 v* \" }7 p; r
            year_2020,& h+ j. h$ e  \8 G5 A" o4 N6 }
            color='#45a0a2',
    0 C; U( I- M6 P3 X  G        width=bar_width,( H& n9 }; k& f. a1 W% z
            label='year_2020'  #图例
    3 x% D! G' j3 K, h% r6 w  I/ Q    )
    # i& I$ s4 A8 `! H$ n    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称' e: M. S6 S/ K6 o0 M! ~
        plt.legend(loc=2)  #图例在左边" v/ Y2 N3 k" P, e1 @) s1 \) W
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 : a5 H6 u: a1 _; p5 q4 D$ }
    8 w3 ~9 g7 G" W8 D
    6 j+ @1 c/ T7 k1 E1 m; v/ _, P1 e
    4 H; u* O7 R. }9 p
    & J7 e0 F# @' ^9 n# r, ~- T5 ?
    5 v" x4 R5 X1 D0 }8 [

    1 y2 e7 k' W$ Z! x# `以下参考: Python可视化|matplotlib10-绘制散点图scatter6 |3 {) o4 j3 e) Z7 n% M

    2 H# G: `. M1 P: i0 g3 e
    # S, q; \; ~" B, K
    import matplotlib.pyplot as plt
    9 b9 C/ R( C6 C: ^3 ~. qimport numpy as np
    : `, H; [+ d$ [8 |8 wimport pandas as pd( T; C. V! F; S' E1 w, B& z1 R
    from pandas import Series, DataFrame
    8 G; e1 }5 i- {#数据准备! R; P* K, d# S1 F4 R* ?7 V
    from sklearn import datasets! N; @" j% \; _7 s" q
    9 [0 z' b7 Z# M* Z' E% |
    iris = datasets.load_iris()
    + \- s6 @/ P4 k5 f8 M5 O) Yx, y = iris.data, iris.target) f/ d* L- [; V/ h" c6 j6 D
    pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),, M! y2 e9 G7 Z  S$ Y# U3 x
                           columns=[2 n! g2 X9 R6 a, l0 \
                               'sepal length(cm)', 'sepal width(cm)',2 {. V' K( T" X* J3 n
                               'petal length(cm)', 'petal width(cm)', 'class'
    " F9 C( Y. Z7 x! L% m; d+ y. |/ Q4 _7 o& c                       ])( |. j. D/ q* T7 J/ `
    with plt.xkcd():
    ; Q6 ^. @5 r7 r% F" B# C
    " L& _7 q$ Q7 h3 V$ H    plt.figure(dpi=150)  #设置图的分辨率
    7 {9 Q; ?7 V) o* c, r* G: y    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    # l  v9 q3 h" O. Q, D1 S  d5 D( D3 Y+ m    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类: p. r% s- F- Z
        iris_name = iris.target_names  #获取每一类的名称# c  m: P% [" `* r: H) S( U% Y) _
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色' l" y& @% v8 n& W( F: J6 D
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形; }' `# }3 b4 j* V

    3 k7 C; k+ b/ `    for i in range(len(iris_type)):
    . W% A  L% `. X0 i7 n! i( U0 y        plt.scatter(
    3 C7 n. s2 n* S" P* z            pd_iris.loc[pd_iris['class'] == iris_type,3 n9 }1 Z  z# K
                            'sepal length(cm)'],  #传入数据x1 z* l9 Y3 _9 f* V
                pd_iris.loc[pd_iris['class'] == iris_type,
    8 C% V- p$ P& r6 W& A                        'sepal width(cm)'],  #传入数据y: n; J) z$ F* s. ]; l* R4 M9 ?
                s=50,  #散点图形(marker)的大小' B/ X; L6 |% S! }+ w9 A
                c=colors,  #marker颜色
    * h4 B) Q" S, X5 {) `7 P, ?            marker=markers,  #marker形状  F' }* {5 U, p
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    9 V8 j5 q1 m4 ?& G3 P- @- F/ i            alpha=0.8,  #marker透明度,范围为0-1
    2 Q6 D6 R! d# I# l" J7 O            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    2 d+ K- \3 O0 r1 n$ I1 S            edgecolors='none',  #marker的边缘线色
    + U* c- |  S; x            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    , d1 o7 K! V* G% f5 g4 Z5 n$ o            label=iris_name)  #后面图例的名称取自label( N! j% c2 J6 t+ R0 d+ X# ]9 B$ I

      ~; \& [' }& r    plt.legend(loc='upper right')- e& t) w- a8 B3 n8 s
    4 q: g6 y/ Q8 ^# I. h

      Y% ?# z5 w$ {: P————————————————
    * W8 H5 Y5 D$ W- f) W版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& T$ i3 y5 n3 v8 a! G
    原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
    ; Y% j; B+ ]' I: u- ?7 N0 x" z6 m0 c, [9 A' e# T

    8 L' Z- s( D9 ^/ l) J2 Y: 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-4-20 06:43 , Processed in 0.414971 second(s), 51 queries .

    回顶部