QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4772|回复: 0
打印 上一主题 下一主题

一行Python代码有多强,可让图形秒变「手绘风」

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

81

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-7-22 11:56 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    0 M' g3 [5 ~8 |+ q
    一行Python代码有多强,可让图形秒变「手绘风」* [! W9 H& \) J% j" `
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具+ |# F6 Q1 [1 U7 h3 o
    ( k9 x  ]: l, m
    6 G* I) _6 }6 {$ ~! p
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。7 e: |* i# ^0 K& y# i* A

    # O& G- H! f8 ?, I! B

    5 f' x$ c1 ?4 P: n! }' qmatplotlib.pyplot.xkcd()简介
    - r) M; w0 m' s/ P1 g这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    0 o5 p4 a) h( g  D1 K" }+ u6 ~; p6 h5 t
    , w& N, D9 o+ v/ W8 N; Y
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度' g. ~2 v- {( ?
                           length=100, #褶皱长度
    , N, P  ], ^# l. t5 o) `                       randomness=2#褶皱的随机性
    5 D3 X" x) l7 M5 N                      )
    ' {! c+ f/ G. k9 imatplotlib.pyplot.xkcd()使用3 a4 A+ ^" e/ |8 f
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    1 l/ O' E5 d1 _* A- I
    : ^' _5 ^$ f( }1 ~+ T1 Q
    . i- g9 y; m$ M" A$ I" `+ u
    with plt.xkcd(scale=1, length=100, randomness=2):) U+ ~7 `' c# ^( D6 c
    #with是临时使用一下,不影响其它图使用正常样式6 G. }* \: J% s, d7 U3 V
        绘图代码
    7 P7 d. G1 }5 s" k; Q+ b. H    。。。。。。
    ; [6 B8 j; O6 h  S( B    plt.show()( @9 F+ ?- U9 S. T# n
    matplotlib.pyplot.xkcd()使用实例
    1 @2 k3 |1 A6 B0 ^下面代码为pythonic生物人公众号之前的文章代码3 G# B7 C) j+ ~  t
    6 O5 c9 d* B. @; _' g
    0 l# Q- h  B2 u) ]) ?) B
    以下参考:Python可视化25|seaborn绘制矩阵图
    - I1 b" t( M3 T8 U6 K7 N  I. C% K( D( |: P% ?/ X( ?4 d. \
    + L# d8 f4 n5 ~
    #支持seaborn. P" G' j6 x( l3 u8 j* \7 |* _
    import seaborn as sns
    , j2 k. s7 B3 T& q6 iiris_sns = sns.load_dataset("iris")/ z! |$ p$ c+ \* d8 b
    with plt.xkcd():. m. P. `  u6 U2 P0 B
        g = sns.pairplot(2 j. u2 e6 e! x' s1 [1 a3 L
            iris_sns,
    * w6 S4 v+ t% s/ r0 s! F        hue='species',  #按照三种花分类
      k/ ~$ `) W+ }& }9 ]& `        palette=['#dc2624', '#2b4750', '#45a0a2'])$ w7 e. {9 U$ g* ^. L
        sns.set(style='whitegrid')& Z- K0 X, ^" w* e$ v
        g.fig.set_size_inches(12, 12)
    # p/ q9 }6 p% G9 _/ |. i    sns.set(style='whitegrid', font_scale=1.5)* e& v. h0 Z6 s8 b9 p9 @# T
      
    5 s9 Y8 I: e- U6 k& J: I
    / b, D3 }" H3 W! j1 z9 |3 s

    # `: y/ n5 ?  i, `以下参考:Python可视化29|matplotlib-饼图(pie)
    ( w% i& E0 X% w2 C0 v* ?* w0 M* j5 c; X# h1 ?; e  {) w

    . k8 U' `& }$ p* C' K& o9 eimport matplotlib.pyplot as plt
    4 T' t3 I, o  |/ i) i5 @7 z# {, J. pwith plt.xkcd(& j  ], n- S7 d1 @
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度( }& V+ {* d+ n! R( B9 u/ [
            length=120,  #褶皱长度
    $ w  V3 ^* S; R4 W) k& @        randomness=2):  #褶皱的随机性9 S( c( p) `+ J" ^, x# b% m' M
        plt.figure(dpi=150)& i0 K! [  j6 B. V. h% \! o* k
        patches, texts, autotexts = plt.pie(
    ! [& i! ?+ `- a3 U( V7 g% y        x=[1, 2, 3],  #返回三个对象
    1 C3 m; j$ k, V8 p' w        labels=['A', 'B', 'C'],  [- U: t, z: j' o0 e
            colors=['#dc2624', '#2b4750', '#45a0a2'],
    $ }8 f$ z! N! b; R! j& j        autopct='%.2f%%',; G2 u3 @, |9 x9 }' I
            explode=(0.1, 0, 0))
    / b: h. V6 }5 F. K1 e' V* A- q    texts[1].set_size('20')  #修改B的大小
    2 t1 [1 p- {" e" c0 E$ E/ P5 Y) l - ?! k6 U. g/ @0 X/ y0 w* @
        #matplotlib.patches.Wedge) s4 A. B) U1 M* g5 d
        patches[0].set_alpha(0.3)  #A组分设置透明度
    9 [+ P0 {8 e4 ?3 e; r. R; U: G2 X; z+ Z& u    patches[2].set_hatch('|')  #C组分添加网格线
    ' d) z7 h1 U# W( F    patches[1].set_hatch('x')
    $ q) Q4 m  T3 Q / C; w/ W# g( }. k& S' o5 Q
        plt.legend(
    1 F  s0 J0 p$ O% c9 [6 s8 @        patches,# s$ c# m; f  C. f. [0 P
            ['A', 'B', 'C'],  #添加图例% K* w+ m. B4 P. T( F
            title="Pie Learning",4 W) \3 M- l/ z! G0 H2 z
            loc="center left",
    1 \" d) U3 ^% Z5 g" I( n$ j) s        fontsize=15,
    2 C2 f) x. h) G* [8 b: T        bbox_to_anchor=(1, 0, 0.5, 1)), h6 u! R4 n# J# d
    ) D5 _! `/ X3 w& Q& K
        plt.title('Lovely pie', size=20)/ N6 O5 \% F" {/ L- W  ^
        plt.show()% c0 n6 x2 {( j7 j. a

    ( t5 S* f# M+ l) y6 L; j
    : S# a. w( o& \1 [! a/ Z

    4 `0 r3 Z: j4 Z8 x9 U5 U

    9 @  x  P( c4 ^  {4 J8 fwith plt.xkcd():
    $ `- x" _) l4 }2 V$ S. y4 y* B! r( c    from string import ascii_letters
    # G4 v6 \3 o* |3 X! g    plt.figure(dpi=150)
      m+ d2 }, {) H( j    patches, texts, autotexts = plt.pie(
    . J/ n: C$ G$ y! {        x=range(1, 12),. y1 P+ ^% a$ i+ o
            labels=list(ascii_letters[26:])[0:11],
    " \1 `) L% J- X7 M7 f+ H8 A- ]        colors=[
    " y) U, }) s9 k; l! i  F3 M            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
    ! n6 Z4 f" R$ q6 e, ?3 L            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    2 j' A! {1 V% k! W$ v; @        ],
    ' F; J3 D- }* C& v* D3 V        autopct='%.2f%%',2 r) O" S/ h0 J8 d  e7 r
        )
    , Z0 g- B! V' R  x. ~# @    plt.legend(
    + r7 s1 G  q4 v$ R( m        patches,
    - q  q" w$ U6 m5 \* Q- j5 A        list(ascii_letters[26:])[0:11],  #添加图例
    4 ]- [7 ?- }' V        title="Pie Learning",1 k5 U( {- x. V
            loc="center left",
    9 n7 G  m! B- W- q  `        bbox_to_anchor=(1, 0, 0.5, 1),' S# C7 y: U$ n8 O& F# y. h+ O
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    : x$ m' v! v( ^  A    )# `7 z' X) a( y7 s8 g' V9 n/ \

    - J* F. G  s9 k9 T! H8 P

    / P0 L0 D/ `5 _1 d% ^; ^, w* p+ T7 e- F2 r& X1 T
    " c# }# ^8 b2 x2 m" M0 \
    import matplotlib.pyplot as plt/ ~$ ~' s% ^' S
    import numpy as np
    % q1 W2 C! H- d) G" h$ Zwith plt.xkcd():
    ; t! b  D% H  j: t. Z6 W  t- B    plt.figure(dpi=150): I( ^& r: ?) n- q$ u
        labels = ['Jack', 'Rose', 'Jimmy']& }# U8 [! E9 v9 _" Y
        year_2019 = np.arange(1, 4)
    ( {- N& e6 |* f1 b! U1 h    year_2020 = np.arange(1, 4) + 1
    & T( G( G' X$ G' H! \( M    bar_width = 0.4# x8 ~" K2 X* |% P" ]

    # X. o+ L  X  r' r) g3 d9 Q    plt.bar(
    + h( R3 ?. f% o, v9 c) F        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    * `& C, ~+ {9 ?. y6 W; S4 d        year_2019,* r8 \* Z4 d- v8 x. X
            color='#dc2624',
    6 C8 z# g5 r. g8 |5 {2 N        width=bar_width,
    , n* b$ e9 V/ y- L/ e        label='year_2019'  #图例
    4 ^+ v7 `  F+ z! ?4 m. [9 V    )) ~: O- L; c7 s8 h0 G% F$ u; G; t
        plt.bar(
    $ m- W9 g1 }8 n7 \- h! h7 b        np.arange(len(labels)) + bar_width / 2,
    1 u; F0 t: a* D7 S        year_2020," w4 c  c$ d4 d2 q5 n
            color='#45a0a2',
    1 H0 m4 t) h( {7 S        width=bar_width,
    : n2 f" O7 l7 ]/ S. @  e        label='year_2020'  #图例  y: \' N7 l1 e8 v( A( T, d* [/ h3 l4 C- s
        )
    2 B) Y! M( B& Z    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称+ V  }9 {* x5 w$ O, P% }4 E+ i4 _" x' N
        plt.legend(loc=2)  #图例在左边$ ^+ ]9 o- B4 e/ C7 ]) N+ `4 K& [
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 % z# f# O# r: M- K

    5 a, s' }' }8 N5 _) ^  A6 z' l
    & J6 a# M+ f) s" x

    ( l) p6 B2 P4 L/ m( P/ j# P

    - }2 q  h4 R+ B
    6 F: K8 x/ t& X' ~
    8 L4 s9 X$ F* C7 `" \' ]- q+ y
    以下参考: Python可视化|matplotlib10-绘制散点图scatter, L* x. C9 C8 r0 W
    & L6 Y; X* |/ _) ^6 C
    * F8 ?+ ]; ~5 q! t: Y
    import matplotlib.pyplot as plt! Y5 W8 X2 T- H, z0 Q. D& Z
    import numpy as np
    # K9 H/ K! G4 f  u' Wimport pandas as pd9 Y) p( d* y! a0 i" J; E
    from pandas import Series, DataFrame
    4 P4 I. Q: X( B4 I% T#数据准备
    * i2 Y- U3 h' B) i  Ffrom sklearn import datasets4 [+ ?" h' u5 N0 Y/ o

    ! _0 \. D2 M! ]! f2 K' Xiris = datasets.load_iris()
    $ T9 C; C' i; V2 Tx, y = iris.data, iris.target! i& ]5 `8 X& B$ o* v! e
    pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
    ' _2 v* q$ |0 v/ U                       columns=[
    / s3 X) k- n) Q9 o                           'sepal length(cm)', 'sepal width(cm)',( @( O9 d& d! T& q! r" T8 I: u
                               'petal length(cm)', 'petal width(cm)', 'class', G, ]3 y2 ^$ p; k
                           ])( ]4 q4 B# i+ i6 k9 T% H! S- `$ {
    with plt.xkcd():6 w0 V6 m4 `8 D2 e1 W( v
    $ E3 M% B0 C- u( Z8 V$ e& c4 y9 D
        plt.figure(dpi=150)  #设置图的分辨率" W$ Q) }/ j( R7 W! f- H
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图) R- S+ k: o. [9 h
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
    * H; h0 F% p6 j    iris_name = iris.target_names  #获取每一类的名称# D2 r% r0 ]9 \6 C2 X! k# G
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色" ]4 M( Z3 v) j5 W
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形
    % ^% F8 i, L; l
    . ^  {/ Q- {. z    for i in range(len(iris_type)):
      F. M4 @: J3 o; W3 {        plt.scatter(
    9 n+ Z* A/ I6 h            pd_iris.loc[pd_iris['class'] == iris_type,
    4 |% d- a6 j- J. U0 |# f' F                        'sepal length(cm)'],  #传入数据x
    : y+ m( M6 q2 P' J            pd_iris.loc[pd_iris['class'] == iris_type,  j- F8 y, @5 G
                            'sepal width(cm)'],  #传入数据y
    ( m; R  A* V$ W, w* W            s=50,  #散点图形(marker)的大小
    3 `" N# T% ]! y/ \; D; L8 T            c=colors,  #marker颜色0 ^9 r: m. t& L. Z& i
                marker=markers,  #marker形状2 w% o+ N9 F7 H& C) H  S/ ~5 c
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充; k. A. e. a* I8 g7 V* n
                alpha=0.8,  #marker透明度,范围为0-1
    % H& N8 P9 P- f* L( q( G* m            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c4 c. D, L/ E  N7 y' n( R1 G4 r2 @4 y
                edgecolors='none',  #marker的边缘线色5 C9 P- J" E, m' |' ^* |, `
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用, V5 l$ y2 \! t9 B
                label=iris_name)  #后面图例的名称取自label
    : v& Q9 ]) H& L  s' Z   _9 l$ W0 b3 ~8 E0 B  p
        plt.legend(loc='upper right')
    : o  o9 t1 M9 T9 v7 c3 s3 E. c: [) C, H( J1 f/ K
    6 @- y0 m  Z' h( P8 q
    ————————————————
    - {' t4 X9 _! k" ~( r8 e' E版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ( |' y9 q1 w/ @9 Y4 [$ v原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
    1 c" }4 Z( ~4 a- J, h+ Z. S- w% ^
    $ B4 L% B! n# a6 o& |4 l" e# Y0 q6 w" 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, 2025-5-10 08:00 , Processed in 0.436029 second(s), 50 queries .

    回顶部