QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6288|回复: 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
    - E: ?, U( s. o
    一行Python代码有多强,可让图形秒变「手绘风」
    9 p2 Y; Q+ V" R' q% J之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具0 @. D: k6 x/ W6 F4 w* E
    2 U( ]6 }+ a# r( h+ l
    $ _- v6 T4 M* Z7 ~! \2 L$ k
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    3 p) c8 V( d3 a- g; W+ ]7 t/ r& e# Q; b. o. z% G  t

    ( u$ a5 q% w" g6 Zmatplotlib.pyplot.xkcd()简介7 v. v) T& j5 J5 e- A: P0 @
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    % m/ ?6 }8 u% n. y, l5 X/ {( r: q! b8 r* K
    " I$ j" X5 C0 B5 x- w; j
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度, m% M1 B  H. J5 ]8 p, m
                           length=100, #褶皱长度( l+ V) }- j" s; m
                           randomness=2#褶皱的随机性
    4 \1 p, a- w2 x$ J) p! V: L' Y                      )
    - i2 D0 \7 F5 x" H5 P. g  ]matplotlib.pyplot.xkcd()使用; q$ [7 u. l7 x. O5 a# r
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    : ?. v$ `( G5 z6 F* \( f0 x; Z
    & I9 q! x7 G  X% t9 Z
    % b/ ]  b. l  A8 S( A8 z! m+ l
    with plt.xkcd(scale=1, length=100, randomness=2):
    " [+ z$ W6 k( y! ^8 }; K. F. O1 ]#with是临时使用一下,不影响其它图使用正常样式
      [5 N; l$ M- k" j! K8 {( j    绘图代码% [- D5 Q- X1 X, s9 @
        。。。。。。
    * H2 Y0 F. x. p- Y    plt.show()! f6 T: z7 M4 C4 [' B
    matplotlib.pyplot.xkcd()使用实例 5 ?2 {4 H- g$ j" @
    下面代码为pythonic生物人公众号之前的文章代码  K- w# j! Z* J* }% p

    6 B  ?5 S; d" H# z- T

    ( ?# w' {/ }4 y5 h8 d. q$ d以下参考:Python可视化25|seaborn绘制矩阵图
    7 H# ?$ S+ T  ]5 C3 l
    ' ]& K; |' V1 ~, ~; Z8 ?% g
    + `1 N8 q5 T" K0 l' G, t, G
    #支持seaborn
    ! n$ G. o+ A  X* U5 G9 eimport seaborn as sns
    ' ^! _5 Y' H" f0 Y6 N% T( Ciris_sns = sns.load_dataset("iris")
    2 b" H$ R+ K% E# F- P; Iwith plt.xkcd():/ K. v! p; o2 R
        g = sns.pairplot(0 Z4 J9 |3 C; Y$ Y
            iris_sns,
    & B4 f6 C9 K+ E& e. {  Y% F        hue='species',  #按照三种花分类! C0 z: M, }. {2 Y* @
            palette=['#dc2624', '#2b4750', '#45a0a2'])
    " E0 Y$ t& A7 b4 Q    sns.set(style='whitegrid')* k4 }, J- d6 _0 w' v2 O( B
        g.fig.set_size_inches(12, 12)9 A) \" h" k1 m/ W1 g8 a5 u" V; O
        sns.set(style='whitegrid', font_scale=1.5)9 |( B2 W" M- [( }
      
    3 ?8 o* H& _: J! x, }& Y' ?
    & T: a$ D6 j$ M. C
    9 f4 w+ X# @% Q. `- ~1 C9 A  v8 T2 e
    以下参考:Python可视化29|matplotlib-饼图(pie) 5 {2 u: q7 z& Q/ Y! h, S
    + j+ x& D- [$ s+ l6 d+ H

    5 a" \: H( B: ^4 R. p+ H1 Gimport matplotlib.pyplot as plt
    / Z  |/ Z$ o, W- \; U0 U$ [with plt.xkcd(& @7 Z( E8 p6 D& M5 @6 L# @+ U
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度9 {, E: b7 l! E2 u
            length=120,  #褶皱长度
    8 P; Z1 x! u/ p7 h* D7 Q        randomness=2):  #褶皱的随机性, W' S2 h# Z' k' ~' ?$ x. b+ l+ m
        plt.figure(dpi=150)
    / ~8 }1 _5 |4 m* L! z" [8 R    patches, texts, autotexts = plt.pie(9 Q# ]8 I$ @1 v3 [! ~9 R, P! p  f. M
            x=[1, 2, 3],  #返回三个对象" t. j, ~# ]; {  j  s& t
            labels=['A', 'B', 'C'],$ o- w) A0 o) v. q- ^2 {9 K
            colors=['#dc2624', '#2b4750', '#45a0a2'],
    & }: x: S9 S$ n5 Y4 r        autopct='%.2f%%',+ q5 x6 e, f6 t( w9 ?
            explode=(0.1, 0, 0))
    5 o- w1 y, l# M    texts[1].set_size('20')  #修改B的大小
    & W8 B7 w7 Z% E5 M
    , S% w# k! L" L    #matplotlib.patches.Wedge+ E) ?+ C0 `  R7 S$ M! D6 \
        patches[0].set_alpha(0.3)  #A组分设置透明度) P: ?; X$ X2 o% e3 D
        patches[2].set_hatch('|')  #C组分添加网格线0 x. r9 E6 p" a3 [. E+ H
        patches[1].set_hatch('x')
    $ v9 O) t2 ^( `$ A2 F# P
    : S) j" h2 B1 q/ V; ~" z    plt.legend(8 C: L/ Z3 s0 O" {5 r/ ^' @
            patches,
    ! ]- Z- x$ C$ X: K0 m+ _        ['A', 'B', 'C'],  #添加图例
    " a7 D( p) t3 T6 L+ Z, Z+ R        title="Pie Learning",
    7 V, \. `+ k% X3 w9 y        loc="center left",; Z+ W0 y* P2 f7 M0 k
            fontsize=15,- }( u& ?5 L: M7 O+ r# S& [
            bbox_to_anchor=(1, 0, 0.5, 1))" H; K) [- P( _& F) O% L' _

    0 g' A8 ]; Y  n  @% H4 ~5 L* j- _2 ?    plt.title('Lovely pie', size=20)+ V2 L4 S& Z& i
        plt.show()
    1 H1 k9 v# G0 V2 A! x& {- A6 {/ S# Z( T+ y8 r' `  x  g* Q6 C
    3 Z, ?/ g2 x+ {! |2 j" P; f3 y/ J

    7 i6 G( {3 \  R# M' a4 k0 c

    7 u2 f$ p) H; u- M1 D. W7 w5 gwith plt.xkcd():
    / T+ K, j9 j; s: i8 V    from string import ascii_letters5 m# C" u/ j+ y# m6 C% G) }# b
        plt.figure(dpi=150)! p) N. G8 t0 y5 d% d. ^, \
        patches, texts, autotexts = plt.pie(
    2 A) Q$ T- y6 T# [" K9 t        x=range(1, 12),! Z* N7 A2 i' w5 x& L
            labels=list(ascii_letters[26:])[0:11],: y7 C7 M3 J3 N
            colors=[
    . J/ P8 c6 e; V8 X" }            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
    0 _5 W3 ?1 \$ w            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'7 u* ]% e& v( V5 q% @) M, W
            ],
    0 N' z, n9 @1 c5 @        autopct='%.2f%%',( N7 \. ~) }& W: m' Y3 E0 W) L
        )
    - o8 N: z  }9 b/ {, R' {2 f) @' Y9 a    plt.legend() N0 b5 I- i! l  y1 ~# @# {' L
            patches,
    + d( A2 R$ q& c; o# B. g        list(ascii_letters[26:])[0:11],  #添加图例
    2 Y) T7 r6 R; Y+ t4 [$ H        title="Pie Learning",- |- O/ p' a/ A7 d0 T  ^; P
            loc="center left",$ G/ P5 i5 c; F$ g( j" k' a
            bbox_to_anchor=(1, 0, 0.5, 1),, _* x7 s$ U  W
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    ! M2 H: l! h! ?$ ]: B7 Y+ J    )7 \9 O- i. q! b6 ]' D' m$ j

    1 O- N6 c! A: C$ o0 y; a# M5 k; P0 J
    & T% V" y6 V- `8 K2 C- t
    8 b8 M" i5 p, U& d/ ?
    2 v* I4 w, l, d# }" a9 D& [
    import matplotlib.pyplot as plt
    / R. ~! I; S2 t& t) |import numpy as np5 l5 m! q; k- V' P8 Q  x
    with plt.xkcd():
      ?; O( K" X& Z2 C# C6 h    plt.figure(dpi=150)
    . b2 ]3 u! g4 o7 C6 l5 K: V    labels = ['Jack', 'Rose', 'Jimmy']
      D+ V1 O1 I* |" \    year_2019 = np.arange(1, 4)
    * V& M: A, ~7 C( c7 d    year_2020 = np.arange(1, 4) + 1
    * J- k% ?5 m# ?/ y: m, }0 u! D3 D    bar_width = 0.4
    1 K# ^+ A, |7 W  P! K0 e- }$ Y9 |, O
    ) K0 R6 ]' p4 r) d. K. N3 L  b4 q    plt.bar(, D5 O% R9 _& ^6 v! P, f
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    ! |! b/ v1 x8 O9 y' C        year_2019,
    ; p- K. o1 g6 \& D5 ^; }        color='#dc2624',
    % T; f, O) B; A8 {. b5 L1 a* `$ d        width=bar_width,
    5 w. k: Z4 J- I6 U, R        label='year_2019'  #图例5 a. m5 s9 z' D& S; e; d
        )  ?& e# |, T: R$ [
        plt.bar(5 Z# ?9 V3 C& ?3 b/ u5 m7 g0 D8 y9 F
            np.arange(len(labels)) + bar_width / 2,; `) D% g3 S4 S, t: c) w, n
            year_2020,8 G2 H4 ~5 J. ?0 w
            color='#45a0a2',
    " y* E3 z) Z' d9 s6 @0 ^5 q& R8 k        width=bar_width,
    % p" w: w% e7 C% t0 q: {* a/ u        label='year_2020'  #图例+ o0 @+ _- f% e0 Y: ^
        )6 |7 J, O3 R# D$ ?* A
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称- E# X% m3 p8 ~  }# n+ s+ d
        plt.legend(loc=2)  #图例在左边
    6 B' p' H1 o. i4 }# |) Q/ d% x以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 ) y: b: Q8 ~; ]5 _; g) N

    4 ?# @3 c! l$ M; x& [
    ) U) V2 W4 J0 a4 ?. A8 _' ^, M

    9 a9 F9 G2 `1 X4 L

    # D( G- k! K/ I; }% P3 U$ h5 U6 j
    & q" ]! |' m- a
    以下参考: Python可视化|matplotlib10-绘制散点图scatter! D% U$ f+ k  W& M" P+ ]

    # C: W# k! d% t# X
    * q4 z* l$ D& F5 l& C+ G
    import matplotlib.pyplot as plt" ^2 y5 k. o/ l
    import numpy as np+ a+ L/ i, U9 p* g5 t
    import pandas as pd
    # I+ {9 o1 d: r* J$ J1 wfrom pandas import Series, DataFrame2 R( f  |6 ^$ K" F/ c, r- j
    #数据准备+ t. a2 o3 U( p6 h( _
    from sklearn import datasets& J* A# T) S8 |% G$ j

    2 t- \+ O! V/ C. i) y. @iris = datasets.load_iris()
    & s$ b% k/ C8 o6 N1 a( Wx, y = iris.data, iris.target
    4 {+ i8 q' [2 v' ?& j# L# hpd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),3 _" X( h& q3 L9 H4 i* W7 y- I
                           columns=[
    5 z0 d  ?; Y! j( i' ]& Z                           'sepal length(cm)', 'sepal width(cm)',+ a' o$ n0 D8 X* A& A
                               'petal length(cm)', 'petal width(cm)', 'class'8 C! o$ q" k& Y4 _( E) L+ {
                           ])2 _, e; V6 s9 M, J' c1 ?
    with plt.xkcd():0 z$ l! e5 B$ E4 e1 U
    * F0 i9 B% V6 q3 u' C* n
        plt.figure(dpi=150)  #设置图的分辨率. m# \. u1 I9 j2 O
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    ) ~* a/ Q) u: i& p    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类% i1 f$ u2 o2 l# h( W- L
        iris_name = iris.target_names  #获取每一类的名称
    % l4 m' [3 w# @# P9 v    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
    5 }0 I7 o' h1 L6 p! Z/ N    markers = ['$\clubsuit$', '.', '+']  #三种不同图形; S' J6 K1 u3 `& e5 O2 h7 `

    & m' B$ G5 R1 o$ a- P    for i in range(len(iris_type)):. J% ?* B; z1 H7 y' j
            plt.scatter(9 V( u9 Z: J5 Y$ {; T! j: @
                pd_iris.loc[pd_iris['class'] == iris_type,
      ]$ F4 J' H. ~- {1 W                        'sepal length(cm)'],  #传入数据x
    3 ], u1 t/ a+ S            pd_iris.loc[pd_iris['class'] == iris_type,+ ?2 m1 e" o, v: N0 }! f
                            'sepal width(cm)'],  #传入数据y
    + I7 `4 B+ }; t5 x2 l            s=50,  #散点图形(marker)的大小
    4 L! V' A* y$ H% Z            c=colors,  #marker颜色" i2 Y5 z& M5 E) F: u
                marker=markers,  #marker形状4 y, F9 F& p5 B7 e& n2 V1 i) q
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充; e9 \: v4 E* S# }
                alpha=0.8,  #marker透明度,范围为0-1
    * b' q/ F* @! a; w+ f            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    # r6 _8 ~$ @7 Z9 B/ L! s* G            edgecolors='none',  #marker的边缘线色
    3 |  ]- U; ]% Y2 _            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    3 G  a, V4 |6 T( f- }            label=iris_name)  #后面图例的名称取自label
    " k7 L" i4 X) s) O) L+ D
    & L+ k3 A% H" @$ g    plt.legend(loc='upper right')3 N0 E' F  e* y

    2 ^: M, z! Y" o' j* x
    . Y3 q  I  S# q# Y4 y+ L) W
    ————————————————) u6 n- o% L3 h
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    - t5 e- q) _+ p+ |7 }原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753( E0 y, Q* w6 z3 h8 n5 e' T4 ~- G9 I
    4 _% F5 N" m4 N7 a2 d; c- h

    $ i8 b( T. C! x  e' {
    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 21:01 , Processed in 0.406050 second(s), 51 queries .

    回顶部