QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6245|回复: 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 Z9 g9 Y, J2 q. v- q
    一行Python代码有多强,可让图形秒变「手绘风」4 w) a- @; X. ~  I
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具) o# r& A% w! S+ L' j, H

    / B& d1 d- M- A; S) O

    1 h* \: x# L, ~9 M/ O但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。" j7 x- |6 H5 J" A

    & u" J7 E& q1 Y) I4 G. d" H

    2 `+ s2 [8 G* s% Nmatplotlib.pyplot.xkcd()简介, b+ e: `% t- ?  `
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    2 t& M5 c' m1 ~! N! K6 M
    3 C  O5 v1 e: D6 g8 }4 J
    $ N, E- q$ |  ~+ V! E8 `3 _
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度( W7 `; i3 P8 A5 ^6 w2 U: v
                           length=100, #褶皱长度
    1 U7 o- n* p5 j6 i% m5 z, _9 n                       randomness=2#褶皱的随机性
    0 Y0 D& s1 x9 ^; D4 P" V                      )0 j$ S! ]" p/ B3 K# }+ ?* ~
    matplotlib.pyplot.xkcd()使用1 z6 P0 ]& X' h6 z6 L6 `  H
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    6 S& h3 c7 F7 z/ d' @8 _8 Z& s2 s5 M9 z* X; U, z
    6 T* y9 u) k& J+ b
    with plt.xkcd(scale=1, length=100, randomness=2):
    1 u. D& W5 b* r% |  v1 f$ C' p#with是临时使用一下,不影响其它图使用正常样式
    7 v8 ]+ ^2 O, S6 i! x    绘图代码" s8 H) p3 ^/ e6 V6 |& l) [
        。。。。。。0 }. I0 i; c0 Z5 o9 K2 c5 g
        plt.show(): t3 n1 |" H  }, H2 {; Y
    matplotlib.pyplot.xkcd()使用实例 9 S  y* X0 I2 D3 X3 ]8 b1 I
    下面代码为pythonic生物人公众号之前的文章代码- G- N4 c5 x6 F1 X0 ]( D
    4 |$ C* e4 \; e" j
    & o- d& b- o& X& K0 T% P# Y$ [: G
    以下参考:Python可视化25|seaborn绘制矩阵图7 p. b/ ]3 x$ A- e
    # E6 N3 ~6 w' p" y# ]

    2 V4 Z* t3 N  q#支持seaborn
    8 G! K, M4 ~; S0 G; u9 F! k. k7 f+ U. pimport seaborn as sns2 \! X0 b+ H0 \5 ~3 J+ G
    iris_sns = sns.load_dataset("iris")- P! Q' A4 d& W" Y4 F1 y- c
    with plt.xkcd():
    " W+ b! e' r: D2 K    g = sns.pairplot(
    " p* t1 g+ H# C- I6 I# t; @        iris_sns,! ]" S' H! T" M( Y
            hue='species',  #按照三种花分类7 l/ }# E' z' m) h* z* H
            palette=['#dc2624', '#2b4750', '#45a0a2'])
    ( F: k: c. A" Q. G+ ^    sns.set(style='whitegrid'): T% ?& F) }& x
        g.fig.set_size_inches(12, 12)$ B* a7 l; E8 @* H, H& O
        sns.set(style='whitegrid', font_scale=1.5)
    ) h6 B& ]$ ^4 h  : C. Q/ H+ v3 H' Z
    & S4 t# \2 i7 Z

    3 ~2 v$ s# P: n6 G! x1 C# ]以下参考:Python可视化29|matplotlib-饼图(pie) 7 {! x! T: p4 j1 `1 A
    . ^! W, ~( n+ l1 W% w+ m7 U
    , [1 t3 M( P% T. }* O: F. l
    import matplotlib.pyplot as plt
    3 x  Y# s; R) S, Bwith plt.xkcd(
    " z& G* S" m8 v' k        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度4 T  X! I, K: R2 i! F! `" |
            length=120,  #褶皱长度
    2 N1 i$ D9 d: f# K3 ]! ~( |' d1 l        randomness=2):  #褶皱的随机性
    + T. |* ~7 m8 J' P+ J0 `    plt.figure(dpi=150)
    0 d. z$ D7 z. {6 u3 P    patches, texts, autotexts = plt.pie(' ]& q: S' s- A  R
            x=[1, 2, 3],  #返回三个对象
    % ?( W  N6 `; N2 }$ f1 E        labels=['A', 'B', 'C'],
    ) V; f0 r; l; a& v6 N        colors=['#dc2624', '#2b4750', '#45a0a2'],
    : X0 t  R" A* r& L  |4 @        autopct='%.2f%%',
    # J: Z! w% t. b2 ^7 m9 u6 j        explode=(0.1, 0, 0))$ N$ s- w! e% E& Q; j* k4 l' P
        texts[1].set_size('20')  #修改B的大小
    1 t' N5 I3 V0 G2 a6 H0 b- C
    9 l2 R" @( e# s! m; P    #matplotlib.patches.Wedge: F1 r) C# ^- r) k
        patches[0].set_alpha(0.3)  #A组分设置透明度
    0 Q* O% }- O/ _! g9 L6 L    patches[2].set_hatch('|')  #C组分添加网格线0 s, p3 ]$ k3 I, x( b* P
        patches[1].set_hatch('x')- G0 H( d) |. z
    7 o& p* m; E1 k, s6 v- Y: U* n& z
        plt.legend(0 B. b- b+ H/ m9 L
            patches,
    5 m+ T" h) f; X* Z        ['A', 'B', 'C'],  #添加图例
    " |6 V4 C1 C& u# @        title="Pie Learning",
    " ^. n3 r% V9 y7 V        loc="center left",& i7 ?% r4 Z* x
            fontsize=15,) V$ G8 R0 b6 W" l0 e
            bbox_to_anchor=(1, 0, 0.5, 1))0 R  ~+ ~1 b2 }/ s5 X2 T: z0 y' u. F

    # {" A$ C) o. o. J! w/ t6 E* c    plt.title('Lovely pie', size=20)3 L! z/ m0 O9 Q8 m  e4 ^9 _8 F' u
        plt.show(); F: Q( Z  _: o% W8 E; b6 q

    3 ^# _  @/ C5 i( o( i
    ) k# M3 w; A% K; W6 e7 J
    0 N" z8 |. J8 I5 \1 x
    4 ~% F4 \7 g9 S) e! U- N# ?7 G# b0 ?/ N
    with plt.xkcd():
    , I" Q" X; o$ \    from string import ascii_letters
    - U; u$ Y. V/ ~% G% Z" t    plt.figure(dpi=150)
    5 r" a. q" ?/ U, M; s4 i5 \    patches, texts, autotexts = plt.pie(+ x; ~0 `4 N3 I7 Z8 J1 K- ]
            x=range(1, 12)," }$ D& Y' d! E1 e0 Y
            labels=list(ascii_letters[26:])[0:11],
    - @# X3 P+ z4 t/ `1 ?$ f/ X        colors=[1 ]  @5 \# H) L/ K' E/ {/ F( Z
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
      n/ M/ Q& t$ P) `            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    , N, {* X% m9 Y- Y* P  H' ]% I& a        ],- M$ h+ D' L2 l
            autopct='%.2f%%',% `& K- [, U& `4 ~, o6 F+ o
        )
    ( v& n/ V& C0 I) q+ r    plt.legend(
    3 t/ B9 x2 ^& g9 V/ S        patches,
    0 \9 j* q: J! D' p        list(ascii_letters[26:])[0:11],  #添加图例: A0 B/ O, Y4 H/ b1 o/ Y
            title="Pie Learning",; [# D4 B$ R0 J' ]0 v
            loc="center left",5 s. P6 C- g* M) X" |3 l4 o9 Z
            bbox_to_anchor=(1, 0, 0.5, 1),. M" L- ]" M5 `. M% }) P
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,  K  r! F3 J9 @  x* V4 [. Z
        )
    0 K" d1 Q3 `4 q& M3 @% Z% d8 `4 B0 W0 s2 @" e! k' T

    0 H/ t* N+ K5 _3 J0 I
    : S  r$ z. }* B8 v! j4 G  J
    0 d& y- u3 @' }
    import matplotlib.pyplot as plt
      e: V3 o8 I4 P4 l1 jimport numpy as np
    ! S' W5 p, ?1 V, P, [2 M) Y% ^with plt.xkcd():
    5 }0 P# U* c! B, v' h" ~% N9 l1 p; d    plt.figure(dpi=150)
    % }" j+ S& v' G% G7 W    labels = ['Jack', 'Rose', 'Jimmy']
    9 L1 r7 `" S+ c8 M. j% h! [    year_2019 = np.arange(1, 4)* R2 A* q& g: D! _3 p/ B! x
        year_2020 = np.arange(1, 4) + 1
    1 _  {5 }  |. Q  H    bar_width = 0.4
    0 s# Q- ^4 r3 {- U
    * x. q2 ?3 T9 K3 ]. R# @    plt.bar(
    6 h) o/ A" O: M        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    2 I. R- v. e9 y, L8 `5 W        year_2019,9 y2 z# Z6 W+ {4 b/ h. v
            color='#dc2624',
      ^1 B: [3 p* y9 G3 X$ _) P        width=bar_width,5 i- u& i/ w: H  d9 W, b
            label='year_2019'  #图例& \& Y3 K" }% x
        )
    & n6 g  Z$ ?2 w, T) u( i    plt.bar(' r7 \; C0 D2 D5 U3 X6 b2 i
            np.arange(len(labels)) + bar_width / 2,
    * l; x4 i5 p% X9 f' _        year_2020,; L: r2 ], C3 e; r- r
            color='#45a0a2',! ~+ T6 Y# R/ g
            width=bar_width,
    * r( ^0 ]+ `& I" S$ I2 f5 j2 n        label='year_2020'  #图例
    ( o' Y9 A% O" y3 q! Z# K$ X    )
    # x, n) S' z" W( e    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称% l8 P8 D" i/ G) l3 x! J) Z
        plt.legend(loc=2)  #图例在左边& w$ J+ w: w$ @3 Q  a, @5 p$ @/ s
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
    , w0 \* X8 \) Q- [) o& o$ b0 s$ a/ C& c! w. O) O, n8 [1 y% I

    7 M- b: r: }, o: m$ O) ~7 s3 D, b6 U( q+ e

    7 v$ ]- Z$ H9 D% r3 N" w) h: L8 W, k9 |  ~- }7 G
    # g% i( E0 n2 F- h7 Q" K
    以下参考: Python可视化|matplotlib10-绘制散点图scatter# ?1 a+ W) l- b7 H  ?. k
    + y; q3 q8 @" U  {4 g9 K  b# B! n
    4 n3 g9 N( c; u; c
    import matplotlib.pyplot as plt
    6 t/ H  z8 _9 v0 n% W9 I; W: I6 B( cimport numpy as np  q6 [4 |* V9 q5 ^3 M; u9 q% ]
    import pandas as pd
    # T7 T" n: A0 {! i  Yfrom pandas import Series, DataFrame
    , m$ q/ ^- n1 \1 ^4 Q, Q, d4 j#数据准备, g  {9 p6 N5 \3 k; B9 l
    from sklearn import datasets
    6 I7 h' w8 |; }3 Z & @) Q5 u: q: y* H! I: E  ~
    iris = datasets.load_iris()& V$ t: b3 K& ~, L
    x, y = iris.data, iris.target: `8 i, L" B8 z$ g( {7 B! W
    pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1)))," e' |4 F) \. l; ?/ ], n2 \
                           columns=[! f4 F3 r& b# I) f6 E7 o
                               'sepal length(cm)', 'sepal width(cm)',
    - c1 [9 b6 F) Y4 A                           'petal length(cm)', 'petal width(cm)', 'class'4 g% l$ c5 |0 I
                           ])7 ^8 t+ |8 D. a: y2 c
    with plt.xkcd():
    : T( r2 w7 _# P) s0 ~# B) j' v
    * X: g/ N0 O7 T2 ?7 K' n% K    plt.figure(dpi=150)  #设置图的分辨率/ S9 C) ?& W4 `' r; P4 z5 P. U9 e
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图- N( `. m, z' R
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类! n& f: U+ |4 z; r6 Z
        iris_name = iris.target_names  #获取每一类的名称+ D. g+ J8 T5 B% T
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色% u# |- v( V" e  d: s
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形
    , m9 l% f- ?5 k; b8 d0 q6 g- B& t ; x1 w( i3 L! p1 q# L
        for i in range(len(iris_type)):
      [% y- G) u3 R5 Z2 o- O( _        plt.scatter(+ l- G/ T6 V; p# z8 h  P/ _0 F
                pd_iris.loc[pd_iris['class'] == iris_type,; g; n6 G. Q5 l% A$ L
                            'sepal length(cm)'],  #传入数据x$ o6 D! m% _: H% I1 S
                pd_iris.loc[pd_iris['class'] == iris_type,
    : P) b4 ~8 k! x' `: S' N2 P: W                        'sepal width(cm)'],  #传入数据y
    - h# G0 D' K. M. u            s=50,  #散点图形(marker)的大小
    3 C% ~3 g# w: H  k' q. K" B3 b            c=colors,  #marker颜色
    . s' f! R( p: V! z- Z+ V: b* p            marker=markers,  #marker形状
    . v- ]. [2 h# V) O( }! L( t            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    1 z# U/ e: j& C: \            alpha=0.8,  #marker透明度,范围为0-1' N/ H) b; \$ e* x5 f' |
                facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    4 x! y" ~' I" m: S5 S5 v            edgecolors='none',  #marker的边缘线色' W) t% h+ t1 X. n1 W; A
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用9 A& s. d. X7 h5 H* J8 N5 k% ]
                label=iris_name)  #后面图例的名称取自label
    8 h, w/ e, w) d5 ~5 j 8 ], R* [6 T% ~' p- X- x% q6 {5 B
        plt.legend(loc='upper right')
    * a1 x' f$ p% x. @* Z
    + ~8 ~1 l+ |: ?# c$ V

    3 `3 }, o  B% I2 W  z————————————————& u! b* A/ _1 j7 F
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ) V2 m1 i5 l; N8 C. Q% T7 N原文链接:https://blog.csdn.net/qq_21478261/article/details/1189637536 E* |' M$ g5 ]  U2 f9 K' N' d- ]
    + E0 s5 o' O# K( Y& C3 e

    1 A* Z& J( ^$ ]. ~2 F
    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-6-3 14:17 , Processed in 0.411647 second(s), 51 queries .

    回顶部