QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6262|回复: 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

    , o% A5 a: ?8 Q6 {% f1 _一行Python代码有多强,可让图形秒变「手绘风」
    / u: n# k! Z- O( K0 h之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具( Q; S# T) d3 r9 y% E. E4 ~' ^5 ]

    3 C) o0 F$ c0 O

    7 ?! s7 ^' Q1 e0 G/ m但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。' X0 H5 e1 I+ R1 H
    / w) r  J9 u+ T5 Y3 o' _6 A$ d

    7 u$ k; d3 a7 q) m1 D% u* Zmatplotlib.pyplot.xkcd()简介; t+ t: _. n4 b* U6 y- ~8 o& `
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小2 x' A& C$ p% e; y. o
    5 H4 a6 a: \6 h# a* P

    9 H- S) u/ s( N9 M2 wmatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
    ; c' J/ _; M: V* G0 C4 |                       length=100, #褶皱长度
    + }8 c& k% R( E8 U" {                       randomness=2#褶皱的随机性' c, B2 m4 `, D! l4 x
                          )
    9 B  E4 E, w3 ~2 ]- L5 d# Z2 }" xmatplotlib.pyplot.xkcd()使用
    # x0 I: G* f/ C' `1 {" @如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    6 J5 f) z4 X2 J) q! V
      ^2 V. I* i3 d+ v" v1 g% ~% K* j

    * U% v5 N- ~; G, v& T/ twith plt.xkcd(scale=1, length=100, randomness=2):. k4 ~# P( l. I) P
    #with是临时使用一下,不影响其它图使用正常样式
    5 e% S/ }( h6 W7 H    绘图代码
    7 _! r4 A( {1 K! N9 k    。。。。。。9 n. T" V* @8 B' }/ a
        plt.show()
    ; ~2 \2 B* U, u9 [3 L( ^matplotlib.pyplot.xkcd()使用实例 : z9 Y! C( B# r4 P
    下面代码为pythonic生物人公众号之前的文章代码, \! Q4 @9 g; O
    1 X$ o3 |! U9 }$ R, R1 B: C
      a! n) h' O; M% }) k$ W
    以下参考:Python可视化25|seaborn绘制矩阵图; y, k" I) y2 e2 ^$ g4 w. E
    . _# r" R1 |* P9 a+ R% Q9 M

    4 ]* g1 z% I4 o+ N#支持seaborn( f3 d7 y! g2 l& f/ M
    import seaborn as sns
    * v8 O) K" G1 w5 K: _! Giris_sns = sns.load_dataset("iris")9 B4 ^" @5 p. |) I6 q
    with plt.xkcd():6 i9 r- j# r2 G" B, M) |
        g = sns.pairplot(! v# }, r& n3 u" @7 b+ O; I2 a0 q1 k
            iris_sns,
    * R3 v2 @+ M# Z. O+ [        hue='species',  #按照三种花分类( Q' ^/ v6 A5 h, ]% C8 x, M
            palette=['#dc2624', '#2b4750', '#45a0a2']); d3 V$ n- W% k7 S' H
        sns.set(style='whitegrid')
    6 y: P4 m7 U  a+ }/ V9 u" O& M    g.fig.set_size_inches(12, 12)6 G& m6 ~. M" X9 t
        sns.set(style='whitegrid', font_scale=1.5)3 ?/ m6 t$ @6 e0 q- h
      
    6 \4 O9 \% {# K  n8 n0 H) a; T9 W5 b& r5 q  F- Y- n# d: @
    5 [( `0 U9 [; ^6 A8 L
    以下参考:Python可视化29|matplotlib-饼图(pie) ; S4 X/ [4 X( ~5 t3 [4 P: Y8 z: F

    + Z+ ?, p4 ]* j# T5 ~3 c
    , t( a+ Y" j7 e3 h0 d
    import matplotlib.pyplot as plt7 B- e3 E8 L1 D! g, n, ~) [% m
    with plt.xkcd(1 E! d" D; x6 ]" ?
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度
    6 V. ^# ^0 h4 T: S: j2 w" O& _        length=120,  #褶皱长度
    8 Q  }( ~; I. {# G        randomness=2):  #褶皱的随机性
    : T; i4 e, {9 d( A6 R    plt.figure(dpi=150)
    + _) B8 X5 O3 |. z    patches, texts, autotexts = plt.pie(/ ^9 J. ~' p8 ~2 N( ]9 Y$ C& `+ V2 X5 F
            x=[1, 2, 3],  #返回三个对象5 g/ s6 F( h+ ^, i+ c
            labels=['A', 'B', 'C'],) `& h, m' n, Q  z0 G
            colors=['#dc2624', '#2b4750', '#45a0a2'],
    ! Y. E. h; b! s& F" k6 s' {8 G0 |        autopct='%.2f%%',
    + {" i( F/ X. F# T( j, z        explode=(0.1, 0, 0))
    : v- ^. D3 D4 _6 M7 [    texts[1].set_size('20')  #修改B的大小
    - u5 W3 ]6 g; v# r0 w5 g
    8 d: _; f2 G4 z5 H4 t& y" m( m    #matplotlib.patches.Wedge
    - f/ A  _: L) @    patches[0].set_alpha(0.3)  #A组分设置透明度  F' D# q9 x& B- B' B$ q! f
        patches[2].set_hatch('|')  #C组分添加网格线
      A0 u) T9 `2 I$ K& [    patches[1].set_hatch('x')
    5 \: k& s6 C3 @1 u % u1 E: W& t# ~" f& d5 r# l; A
        plt.legend(
    ; G' ~0 G5 M4 X  O) p        patches,! V/ m. s% G+ y$ n
            ['A', 'B', 'C'],  #添加图例2 k! C5 @4 l& z+ [
            title="Pie Learning",- s4 l1 r& {. R7 u; K
            loc="center left",
    5 ~$ ~6 H- O- A+ O        fontsize=15,
    5 y1 w; b$ Q1 d8 Y! Y: K6 m3 ~0 L& J        bbox_to_anchor=(1, 0, 0.5, 1))4 O# P/ G: A# a

    " H% v; y% P$ y1 N. {    plt.title('Lovely pie', size=20)- r5 l$ Q( K' q4 u
        plt.show()- Q* ]" Z& q  f. y& I

    8 H2 X$ V! ^7 J& f, [1 i& v

    - [8 B! G/ V1 m# `- E! K& e9 q4 T1 e

    ; X, R5 M5 X. v* mwith plt.xkcd():
    " F, Y% r3 D( p' X/ D    from string import ascii_letters
    , O; B( ]5 B; ?! P% {: z4 P1 c* N# r    plt.figure(dpi=150)
    5 c, M. j4 K( x4 l7 Y3 @    patches, texts, autotexts = plt.pie(
    4 ?  e& u! d" b% s4 ^        x=range(1, 12),
    6 l1 C3 _# _2 s7 J        labels=list(ascii_letters[26:])[0:11],
    5 m$ o8 f8 M9 I$ |* c        colors=[
      S. u0 q% M0 F0 @8 A8 T% w' D            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
    * N" ]2 l* O* ^( G" O3 a- z1 r            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    . j' S- h1 i9 |4 j* J4 D/ ?        ],
    + \# @6 p: D5 E        autopct='%.2f%%',
    6 M! i% y0 I( Q" P2 M3 P    )# B. j2 Z. v$ t7 d) r
        plt.legend(
    : u& ]; L* n, b8 `4 B        patches,, J7 N7 M3 k  ]
            list(ascii_letters[26:])[0:11],  #添加图例& t0 c0 K. [2 k. ]6 I- ?  W$ q
            title="Pie Learning",
    & ~* {3 d8 t! J' y  ?, s, W        loc="center left",
    * |3 R, A( P( j5 U) }        bbox_to_anchor=(1, 0, 0.5, 1),  O# V- s9 R8 p6 v
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    5 {( o# ?4 p4 j- n    )  y  O2 q$ _1 @: B

    ' y5 C/ b; K" `: U1 \

    ' L  C6 I- I' p* f
    3 `9 T7 `8 r+ c: b& e
    : a" Z( O% S! J3 P6 u- ?& d2 a" i+ Y
    import matplotlib.pyplot as plt! u+ g( b1 I- I. K6 |# [
    import numpy as np5 }2 v7 H0 n2 @6 m, G! [# U
    with plt.xkcd():7 G: e* }6 ?. X6 Z( ?7 V* f" i) T2 A
        plt.figure(dpi=150)
    # ?& s. }/ Q. _* w    labels = ['Jack', 'Rose', 'Jimmy']7 h( O: p5 M3 Y8 h- Q! s# h
        year_2019 = np.arange(1, 4)0 D5 ~. A7 E, v# {. w7 x& G
        year_2020 = np.arange(1, 4) + 1  y2 e+ F" [3 E' K* D  y4 D  G# D, b
        bar_width = 0.4
    ( o  V6 {) U- [# _  m# W+ V
    - @) m( \. z' }    plt.bar(* w; a4 h# Z! w3 u: I/ h
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽- b  Z! @$ k+ M" ]  @: w
            year_2019,
    : B  d* C& Q7 L. M        color='#dc2624',: O! H: O/ K  u2 \# `) Q
            width=bar_width,
    . P7 k2 _9 t! c4 d3 N$ T        label='year_2019'  #图例& f$ Y5 A+ W& C. G/ |6 B* q# |
        )
    ( V: t3 u+ Y0 P: J    plt.bar(
    3 Q# E) y0 w3 e7 q, K: h! ^        np.arange(len(labels)) + bar_width / 2,, e5 U" q9 o* @" P8 |9 Z7 R% ~
            year_2020,6 o: K' k, G) g/ U# C
            color='#45a0a2',- k% y0 ?) j% X( U4 h4 c# r  H
            width=bar_width,3 {8 }( a9 l" D7 x' v. g
            label='year_2020'  #图例
    2 d- J3 Z6 }0 Q2 c; v4 k    )
    " W. T. K, s0 V- w0 f2 F    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称, D% k: U2 ^) O8 l* K, d
        plt.legend(loc=2)  #图例在左边
      @/ X% {6 t+ H  _, b: d" [& t6 U以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
    " r1 H7 K0 Q+ b4 W" Y
    . X: g7 ?) S$ c& J! A7 z  j
    % S6 C1 |9 s. l  g
    : i7 z5 j3 \- \4 A+ ?2 v( I
    0 X% }% [- S" e
    $ ?' |9 C# L9 o8 S( \) X5 @
    # X% C( K4 C5 T8 O' P  S
    以下参考: Python可视化|matplotlib10-绘制散点图scatter
    # H3 |- w9 e0 t* Q
    5 T# L7 E- u- _9 G

    & W3 G" a/ N7 O& q, P  iimport matplotlib.pyplot as plt
    7 m! }3 j7 l3 L( D; gimport numpy as np; C$ W  f2 |; M+ c0 X4 U
    import pandas as pd1 g9 Z7 f/ v; s# c- U  ^6 P
    from pandas import Series, DataFrame4 r8 H7 X2 W7 L; I
    #数据准备
    * k9 Z; X' }* x' afrom sklearn import datasets
    + A9 ~% V  q4 t: ?; B7 {5 V
    ! L2 |' x" u9 l0 R: ~9 H# ?. F* N& }iris = datasets.load_iris()
    2 ^( n, L8 c) z8 ~/ `7 rx, y = iris.data, iris.target
    ; x( x9 {! m. T% E% Bpd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),) g8 Q7 U% _; ]8 }" ^5 W
                           columns=[4 u: u" X% P! c) W; ?
                               'sepal length(cm)', 'sepal width(cm)',
    $ n0 ^3 f' d' Y                           'petal length(cm)', 'petal width(cm)', 'class'3 b% W/ M0 p4 _+ [
                           ])
    " c+ G! |$ f; qwith plt.xkcd():
    ! D1 I" u3 F- C. D) `. e; f" j - B! O' @5 {4 g" e  U
        plt.figure(dpi=150)  #设置图的分辨率
    + I; M. h7 A2 {+ x+ c5 X! `" a    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图7 T. d, `- U# O+ ]3 [
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类$ v6 O, g$ |0 |) y9 C" N7 C5 e
        iris_name = iris.target_names  #获取每一类的名称
    # _/ f) ?! p: D* _9 o2 p    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色4 b8 U+ m/ X# j
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形
    2 Q. N: G9 r7 f0 P4 U( e6 J + Z7 N; o6 d, L+ S+ N; G
        for i in range(len(iris_type)):
    6 l* O+ ]" i1 |4 N        plt.scatter(
      l* N  s1 L; t& K) s            pd_iris.loc[pd_iris['class'] == iris_type,
    2 R' ?3 p$ l: j5 E% g/ @8 W8 Y( q                        'sepal length(cm)'],  #传入数据x
    % D7 K+ d) ^# h1 R            pd_iris.loc[pd_iris['class'] == iris_type,
    ( M6 K! O5 `% E/ @/ B                        'sepal width(cm)'],  #传入数据y
    , f0 Z: `, h* V& C% M7 K            s=50,  #散点图形(marker)的大小
    % [* F: k. G2 `$ m& R5 _/ V. a            c=colors,  #marker颜色
    " \  }" g  q1 e& F" T. c" M            marker=markers,  #marker形状" y! X  q* `) U* N
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充  V# Q6 p% c. f3 U
                alpha=0.8,  #marker透明度,范围为0-1
    , o; O1 h1 o* p, O/ ^            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    ( D- W. z5 Z  y' V& }2 e9 [; I            edgecolors='none',  #marker的边缘线色2 p6 P1 s! ~7 `& c, u. Y# B
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用: C  X# b- I! E3 ?
                label=iris_name)  #后面图例的名称取自label0 A# J5 j( D2 ]* @- m
    8 P8 S6 z6 L* Y; R6 ?- n* W* f0 a
        plt.legend(loc='upper right'), }* D8 {; Z2 h
    7 }: i: t4 K, S, A

    ' R1 |: Y0 Q  g————————————————. o3 E/ _5 C0 w6 Q. @/ J- S, Z
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    0 G$ L/ w  \& l! e* r3 _+ k6 }原文链接:https://blog.csdn.net/qq_21478261/article/details/1189637530 d2 \6 |' v: H/ N" j& m; q

    ! H2 J, x6 |: ?( }/ M( L5 d8 e- |5 d; s5 n7 P
    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-7-18 08:43 , Processed in 3.558890 second(s), 50 queries .

    回顶部