QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6284|回复: 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
    1 ^: A. O0 i( }8 {
    一行Python代码有多强,可让图形秒变「手绘风」
    ) v, D5 X: k9 ?+ x3 B+ J" S- I之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    + j; O& ~$ t; s  e: g3 l. M8 }" o+ n5 @5 B' v9 I1 e5 I
    , b% Y6 L4 c% }( B! t! C" d
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。  G' H+ x% q- w5 [1 \! {& V
    # h. \" W; |& x) D: u$ M, z0 M
    ! f! W' W! A7 O$ S
    matplotlib.pyplot.xkcd()简介- D0 c# h# ~- C* w7 t
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小* |$ f: }" S; q$ x% h7 c& T, w: z
    ; b$ X4 h7 D( @# Y" Z/ k' j

    ' E5 i* {! ]. `9 o% ?matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
    5 R5 n( F# @+ {: c                       length=100, #褶皱长度2 L7 j$ z+ n; d+ L3 e4 y- l
                           randomness=2#褶皱的随机性
    $ q6 H) c9 P7 F0 f9 l5 J                      )5 l! O/ L+ \7 J- ?; D, d( `
    matplotlib.pyplot.xkcd()使用
    9 J9 o" t3 S3 e* o) T如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    6 j5 B  O6 ?6 b9 E( M4 L! p: t
    # }/ E7 U- e) @# N% s8 z
    0 ^2 n/ d/ m1 C
    with plt.xkcd(scale=1, length=100, randomness=2):
    , ]: C& u- H7 j9 M#with是临时使用一下,不影响其它图使用正常样式6 A, x3 \# i9 {$ h
        绘图代码9 Q: {" v5 x3 d
        。。。。。。
    % m/ i9 |8 J+ o/ i. w, z    plt.show(), \9 \( p/ k8 r/ v* N
    matplotlib.pyplot.xkcd()使用实例 4 ~; p+ f8 O* L
    下面代码为pythonic生物人公众号之前的文章代码$ @0 h- g: L1 _- C& o0 x* a

    / [: a. o% G* b: H0 J, m$ p8 [* F
      ]- @' D; L% B; }7 c  a
    以下参考:Python可视化25|seaborn绘制矩阵图
      \3 ]- D- E. u# M! V$ h5 u" e# h; e
    ! T; h+ E0 T  l
    #支持seaborn
    * k# Z' @9 @( iimport seaborn as sns
    % z5 G3 }, k+ C: K7 Kiris_sns = sns.load_dataset("iris"): Y: ]% H6 F. k8 \) D8 {
    with plt.xkcd():
    4 @4 d2 w  `: J8 X    g = sns.pairplot(
    # i1 ^: {: G/ `; e: A4 ?6 @        iris_sns,6 t: Q& B) V2 j4 G8 }( W
            hue='species',  #按照三种花分类
    , o# o$ h1 V8 N* d7 g1 j        palette=['#dc2624', '#2b4750', '#45a0a2'])8 _2 |+ w1 O5 o8 L! o
        sns.set(style='whitegrid'), @5 A4 r. a& `; i
        g.fig.set_size_inches(12, 12)/ k% m8 b) ?; l% e: ]5 z9 V9 |
        sns.set(style='whitegrid', font_scale=1.5)
    : O& Z. s7 i2 n4 ?  t; `9 h  2 W, _. E1 Q8 j0 x* E
    . @' _( H( X' W+ a+ Y
    5 d: X% {# v/ K+ X8 m$ F9 L
    以下参考:Python可视化29|matplotlib-饼图(pie) " \' g- x0 n( v5 }% I" D( Z
    ( W: ]/ g: d: p  O3 v
    ' J/ c( U* h$ E: `/ @) W
    import matplotlib.pyplot as plt' u+ t; E1 ~; r: b  h! Z  @
    with plt.xkcd(! M3 ~5 }4 S0 O$ ~1 Y
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度
    ; }) F) f- @7 ^        length=120,  #褶皱长度% B: h# d- x! E  f% H. T. l
            randomness=2):  #褶皱的随机性
    : d5 Q* `2 k% p% e    plt.figure(dpi=150)+ G9 ?  _. R/ }  @. g/ l
        patches, texts, autotexts = plt.pie(% K. h$ ?  e- P, I. N/ a) @& o
            x=[1, 2, 3],  #返回三个对象
    ( V6 }# @- J5 T$ N, @5 S7 y        labels=['A', 'B', 'C'],- o9 R" a! R4 ]7 ?
            colors=['#dc2624', '#2b4750', '#45a0a2'],
    5 X- H9 z% u- |        autopct='%.2f%%',
    ; }0 X8 F/ D! }7 C- }, }3 z        explode=(0.1, 0, 0))! h3 F& A/ T& x4 @, E
        texts[1].set_size('20')  #修改B的大小. }, g( E7 O2 F/ X' ?

    % Q  v; b; m3 z7 r+ F/ I9 F) ~    #matplotlib.patches.Wedge
    # W1 Y. U6 E1 W    patches[0].set_alpha(0.3)  #A组分设置透明度
    % l6 G6 R1 F9 E- N    patches[2].set_hatch('|')  #C组分添加网格线
    * X+ Z$ d# C7 J    patches[1].set_hatch('x')- a: W' e- j' @$ o3 O8 d
    * N+ O* V& U2 h' u5 Z0 z% j( d
        plt.legend(
    1 I# G. Q/ y$ M6 A2 ]2 d0 w& T        patches,2 e* p8 ~5 h, a$ I: M9 P4 k
            ['A', 'B', 'C'],  #添加图例
    : e4 O8 R0 t! c( a        title="Pie Learning",
    / Q$ o* ~; f* \# s- _- A        loc="center left",$ m9 _' f0 @: {- X0 F
            fontsize=15,
    / V$ R8 g( g1 M' w        bbox_to_anchor=(1, 0, 0.5, 1))
    # T7 l! j  ]# i' v6 }6 I
    2 I' [/ w; Z  G5 }: y    plt.title('Lovely pie', size=20)
    8 {% l( v6 a0 C: R0 t, E8 R2 _& \    plt.show()/ R+ k. {- V& e

    3 R# }: ?9 P& d

    7 U5 y  Y: V7 U1 V9 _* ?
    * l8 t7 R" R) w8 \$ }

    % ]5 h& n0 I! s* Lwith plt.xkcd():
    / k. T5 U& g; a# x/ {4 K. Z    from string import ascii_letters
    " }% Z/ `1 N9 J- D- E    plt.figure(dpi=150)
    7 O: B  Q0 P7 c% y5 E    patches, texts, autotexts = plt.pie(" |; R2 D1 e0 G2 |) y2 s; O0 o
            x=range(1, 12),7 F! U7 r" U; O
            labels=list(ascii_letters[26:])[0:11],
    8 V) \% c4 p+ a/ c1 m( b" m$ V        colors=[8 ?, k' ^) n* l" ^2 W( ~
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',/ r2 @7 N0 I- q5 V9 {
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'/ m& ]  x  `, h2 m  n: Y: P
            ],  j6 v7 f; R6 ]- v* r+ B
            autopct='%.2f%%',
    ! \% v7 V# o; o, e    )4 }3 \; i& O4 x1 m, s
        plt.legend(
    * \! V3 s- Q$ [- h% w        patches,$ N/ I1 R: m6 z4 a' ]3 o' r
            list(ascii_letters[26:])[0:11],  #添加图例
    ) u* ~. L  c' g5 b* J8 K, Z* V        title="Pie Learning",/ H8 W4 m2 P+ G$ Q. N0 ?- Z
            loc="center left",8 W4 L  _& q2 ]/ J
            bbox_to_anchor=(1, 0, 0.5, 1),& ], Z. c* J- A9 z
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,6 D. ?" Z4 k: w, T! l8 @
        )
    3 ~! k; F) \8 R/ V- @% [! u9 _( {, \! E
    " o+ O6 {9 \, G% ~( u: w) ?, {
    ' ?, h4 V1 s% D" J" P! s
    ' Y2 G! s+ M: u8 m9 m4 V
    import matplotlib.pyplot as plt6 Q3 V4 F8 R. \
    import numpy as np
    * z' i( _! W9 O7 k3 J" e$ B, Twith plt.xkcd():# Q! Q& o9 ^4 D2 ]
        plt.figure(dpi=150)
    * {$ M6 y4 n8 V8 X0 F+ ?7 Q; R    labels = ['Jack', 'Rose', 'Jimmy']6 z* K' b1 @2 g8 \, ~
        year_2019 = np.arange(1, 4)/ P4 L( E9 N5 {) ]
        year_2020 = np.arange(1, 4) + 1
    3 F" n* C3 d5 }4 v4 Y4 k8 ?    bar_width = 0.4
    ! l$ q. }" m7 I# Y ' v9 c4 u5 N! t# ?
        plt.bar(
    " B5 o  Y0 c% L& u6 |        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽, ~' q2 j; {# A8 Z$ D( u; n
            year_2019,
    ) u; S) B$ \( D8 j" ^) L        color='#dc2624',
    " Q% O# o4 a" f4 j9 M/ F        width=bar_width,4 ?; `& q; D1 I  S
            label='year_2019'  #图例4 X7 `4 x6 K- V
        )
      E. L8 \+ A3 e3 g    plt.bar(9 g4 N, v& b2 e6 N+ K
            np.arange(len(labels)) + bar_width / 2,) u- N6 K1 d5 g* S5 r- P, c
            year_2020,
    % [, m% |9 W% l) i3 m        color='#45a0a2',8 e% o/ Z: x8 x' }
            width=bar_width,: S4 ^; \/ a& E" o8 ~. U
            label='year_2020'  #图例* E' @! b, d- o4 }5 B
        ). r; e( n; J  M8 O( q6 \, P
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称' r! L' _  l+ c
        plt.legend(loc=2)  #图例在左边
    ; Z. N6 E) E' y  [% p以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 ; a1 Y* Q$ J9 p' G( E  g) I: V

    & W; U* s1 l. M0 _% o- R6 G

    8 v# s/ g& j4 l$ D: L! ?  j6 m9 t: `0 w, i, Y" I) T7 x
    + \: U" @) I% C; G9 i, r
    ! k8 F( E0 U, Y0 [

    ! d! i7 w1 r; d( I* o6 T) H( I0 Z- g以下参考: Python可视化|matplotlib10-绘制散点图scatter  R, n6 i6 @& }# x/ Y
    . C) R% x5 ~* |, ~7 e5 d

    8 i9 k- q/ {+ O) o" k2 J- ?import matplotlib.pyplot as plt1 S1 _9 Q, x0 ?- u1 J
    import numpy as np; s. B- N- f. k% o+ C1 c# J
    import pandas as pd
    2 [' u4 o. [1 O  `5 Gfrom pandas import Series, DataFrame
    " F% A4 r" K/ W' z* R#数据准备8 D3 e6 e/ z3 m1 z* R  i3 T& G
    from sklearn import datasets
    9 L( n* L% O( m  h) b 3 b. P' @! V( `, ?0 X
    iris = datasets.load_iris()0 v5 g  X$ K0 W' u% I
    x, y = iris.data, iris.target
    " P  M: \: X! }1 r, Apd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
    - {& O1 t8 C1 B8 D* E                       columns=[
    ( y; p/ b' {: U: N, ?. k1 ]4 S1 x                           'sepal length(cm)', 'sepal width(cm)',
    3 q- `5 E7 \0 |, ?. m9 ^  O                           'petal length(cm)', 'petal width(cm)', 'class'
    7 N4 _+ _# q/ r# S( p8 H                       ])
    9 Y0 D% Z: v  i% v" b+ Nwith plt.xkcd():
    ) k& x# ]8 X5 i" K& H! q2 _ : H' ^1 k" A/ {4 a  ^- ~
        plt.figure(dpi=150)  #设置图的分辨率
    ) c1 c! D  j; U% {. `    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    & F6 H* e4 ~: v2 W# R" T8 w    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类2 h" q" T, C7 L9 [3 g
        iris_name = iris.target_names  #获取每一类的名称
    8 U% J9 O1 K$ U3 K    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
    % v$ G* _5 i0 e$ P/ U( {" k    markers = ['$\clubsuit$', '.', '+']  #三种不同图形: t4 i9 s" u+ F1 v' H
    - V  Y# t9 U/ t4 x
        for i in range(len(iris_type)):
    2 U1 N: j3 K- S5 M* v) Q        plt.scatter(
    8 d9 S' U  N3 ^            pd_iris.loc[pd_iris['class'] == iris_type,
    8 I+ w6 n, K3 O5 B& j5 ~# I                        'sepal length(cm)'],  #传入数据x
    & b6 E' U+ a2 O# V- G1 q            pd_iris.loc[pd_iris['class'] == iris_type,
    : L' \6 A' \2 ]6 y1 w5 Y9 w' a                        'sepal width(cm)'],  #传入数据y
    9 h' _; m7 V% c; Y! A* M            s=50,  #散点图形(marker)的大小" @8 D4 ^+ y' N1 w) G( t
                c=colors,  #marker颜色) _4 a" z) ?2 _4 }
                marker=markers,  #marker形状
    + d+ j3 N7 J" N( p8 n            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    , R: p# f! J, s1 [            alpha=0.8,  #marker透明度,范围为0-1
    $ Y7 N: C) L+ r2 S. y& o( d            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c, p) J; b. W4 T2 b6 j. c& f
                edgecolors='none',  #marker的边缘线色
    0 l( g% o6 \5 A' c- P1 n$ f            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用: k! l" g, S6 Y1 N  g5 B
                label=iris_name)  #后面图例的名称取自label1 s6 n( W" S$ b2 W' Y, T% a: t
    1 h$ H+ o" T! h7 N$ ^
        plt.legend(loc='upper right')
    4 E& `3 K% u, ?  g7 f$ g( k) Z5 {7 w6 l1 Z1 P1 a& ~9 p
    8 z; G3 u5 H2 t5 z& p
    ————————————————
    ) _/ k* Y  l5 A1 M! _9 n版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: x; w, n# _: Q4 B+ N1 ~4 e+ ]( N& R
    原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
    * }& e+ Z( r. ], d- W; e$ b& j  \/ @. h+ G: Z. ^
    , g( L6 y8 m; x# S" F; Z. j
    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 11:15 , Processed in 0.294329 second(s), 51 queries .

    回顶部