QQ登录

只需要一步,快速开始

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

    9 j- Q* Y' \; e; _1 ^一行Python代码有多强,可让图形秒变「手绘风」! k8 M* U2 F& m; E  x
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    9 w+ X/ v0 u6 p# e- k: D2 i9 Q# ?  b, d

    3 b. k- x# c5 _# e+ s. t& [但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。3 a* B+ ?: \! |
    : f2 x/ w1 J. H, r
    ( v" _5 e& Z3 a& p6 b9 ]7 W
    matplotlib.pyplot.xkcd()简介
    % y% z; C! J9 ?" S4 P这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小4 T- R# K( i" u* e! x4 s4 P

      |9 x( Z* S! ?& ~4 e, ?2 o9 M# u/ A% u
    2 x/ }* ?! Q% J4 k; G  [
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
    1 ~& F' j* Y, o* M( d: v$ i                       length=100, #褶皱长度  }) b& S. g% v4 X. y
                           randomness=2#褶皱的随机性* C/ c# M' G; O3 o+ n
                          )- f8 p! T7 }9 T' ?
    matplotlib.pyplot.xkcd()使用. l1 ^# X; Y. j
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~# _3 E. |! H4 s  p  b0 w. b
    . A7 d4 y. y! m% W+ S3 a

    - [( d, }# S, {8 S+ Bwith plt.xkcd(scale=1, length=100, randomness=2):
    , q: m& X# r! ]' P$ F: V1 @7 ?4 T#with是临时使用一下,不影响其它图使用正常样式9 F5 ~( Z. L. A5 G0 y
        绘图代码8 z0 l' H) T# `
        。。。。。。$ a) K9 P7 u# H+ U: ]; _9 X
        plt.show()
    + X4 h8 O" P- _5 I8 q, }matplotlib.pyplot.xkcd()使用实例 4 p! O# g8 G0 {! I3 z1 `6 a
    下面代码为pythonic生物人公众号之前的文章代码4 b) G2 Q/ T* a/ v$ O. E0 T! @
    # h( n" I" A3 q/ E6 C) f
    . Z4 M* L6 s  s- Z9 D) h# K
    以下参考:Python可视化25|seaborn绘制矩阵图0 p2 q% p6 f5 J% t

    0 i: {4 i* h5 D' z! y; o& `3 m
    5 o/ B2 H5 g. P+ E! `& I
    #支持seaborn
    / Z; O/ r/ c) Q0 n% x1 t, r' _import seaborn as sns  k- s/ T4 L$ _( d+ |
    iris_sns = sns.load_dataset("iris")& T* l* }/ Q9 U
    with plt.xkcd():  L  G3 W4 v. c/ }2 Y8 d6 G
        g = sns.pairplot(
    $ o/ [( {, ^4 G' [        iris_sns,3 C5 ^8 B# C7 d, U7 X' J, E
            hue='species',  #按照三种花分类; k$ N1 V; c' A9 ^
            palette=['#dc2624', '#2b4750', '#45a0a2'])
    ! h7 ]3 m  o2 n. C: @- H( w9 b    sns.set(style='whitegrid')
    $ D: G) h6 z2 v! F* T5 S    g.fig.set_size_inches(12, 12)
    7 C* \5 F  _9 I, o* c5 a% c! d* G    sns.set(style='whitegrid', font_scale=1.5)
    $ J1 C: V/ ^4 T  T# b  + v5 k; o' s8 g4 K' P& \3 [

    4 h" T) N# @- ~) U; `4 s) A

    . b$ g: V1 d5 h5 N! B以下参考:Python可视化29|matplotlib-饼图(pie)
    5 H0 H8 Z* g- J" W( G
    & ?2 J9 u; W# `- M& w
    % R0 l+ d0 q5 Z' m6 d
    import matplotlib.pyplot as plt* c' _- y# _$ _5 I& d3 |
    with plt.xkcd(7 G8 ]: U7 {8 o! U! `9 o5 G, Y" a
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度
    ; }, m# I/ b8 h) `3 k, Q% x( u        length=120,  #褶皱长度2 l" _$ G) c9 D7 e$ O
            randomness=2):  #褶皱的随机性
    * B* U  ^& k) ?$ \  f2 s    plt.figure(dpi=150)5 U+ Z8 {+ `2 H* i
        patches, texts, autotexts = plt.pie(
    7 ~9 k9 ]$ ?' v8 {- x, p        x=[1, 2, 3],  #返回三个对象
    $ q- \! `# ]( ?' s, q+ k" \        labels=['A', 'B', 'C'],
    ; v6 O2 V" B) f        colors=['#dc2624', '#2b4750', '#45a0a2'],- z& L/ X; G( ^/ Z" ?9 g
            autopct='%.2f%%',7 y4 Z' }' J3 z0 k) s1 s# o  X3 R# G
            explode=(0.1, 0, 0)): g/ X- x2 \3 l0 @# A
        texts[1].set_size('20')  #修改B的大小0 m$ C5 h3 S3 b' s/ t2 n

    6 Y: U7 v' }+ E8 Q  p& A3 k! r    #matplotlib.patches.Wedge
    ( Z1 H" X; Z3 F' ?  V5 k9 F    patches[0].set_alpha(0.3)  #A组分设置透明度
    - o/ k( B( _! S6 |    patches[2].set_hatch('|')  #C组分添加网格线! U- _" E% R; ^. r, u" K$ J
        patches[1].set_hatch('x')
    4 L4 f6 P0 E" w6 R  P% v7 W7 y: ~ ; a, B( k7 L1 J8 ^# {
        plt.legend(: m0 h8 k- o1 \6 }
            patches,/ t: f& }- y* @8 f8 r# B# J9 \
            ['A', 'B', 'C'],  #添加图例/ O1 O: {7 L  L3 b
            title="Pie Learning",2 p3 G$ A0 b) d; @0 y/ s/ `
            loc="center left",
    7 }6 }: @( z" n- n        fontsize=15,
    0 W( g% U4 M0 k7 l, N        bbox_to_anchor=(1, 0, 0.5, 1)): M' m& L: f. A7 Z
    6 d) S; T& c; _
        plt.title('Lovely pie', size=20). U9 I6 e, _: O# B/ T" C
        plt.show()$ F2 l3 p, e( W/ w9 x* w- M( F- m

    5 a/ n0 v0 l9 S' V& m( N/ U3 q' {

    ' e* G4 P2 c* c6 V- K5 O% |8 I. R; p' U* o, e2 F+ p
    ( A0 I! F9 H7 }& L  s
    with plt.xkcd():
    $ c% J) U  _3 J( b( E: ?0 Y, }    from string import ascii_letters- _) U* Y% d, C5 }5 D8 d/ n- u" {$ R
        plt.figure(dpi=150)
    3 U, Q* }. L9 G2 ?9 j  w# z8 y    patches, texts, autotexts = plt.pie(# [/ ^5 \8 J- l' p0 ]/ J2 S
            x=range(1, 12),
    ; I* U- g1 T2 I( p4 i6 H        labels=list(ascii_letters[26:])[0:11],% R) u) X5 m. E& v9 b
            colors=[6 ]& T) ]& a, `- E
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',0 i) ?5 {( F/ Q6 r+ T5 ^. s0 Z
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    : c/ z/ x, W4 [' l. ?- Q        ],
    5 y7 _6 B5 T4 K. ]% k! d        autopct='%.2f%%',
    8 H7 M- `+ H4 z# b4 W    )
    # A8 L  D' V) ?* y  b    plt.legend(0 z# X+ q2 h& I) y9 P
            patches,
    4 T, H1 H! q( A3 M/ n* l        list(ascii_letters[26:])[0:11],  #添加图例
    3 f. _( X4 A! h/ ?( I        title="Pie Learning",
      i. b0 C( e- `* z        loc="center left"," Z0 k1 b2 a: z- Q
            bbox_to_anchor=(1, 0, 0.5, 1),
    , \+ d* F6 D( e( A6 @6 k: m% r        ncol=2,  #控制图例中按照两列显示,默认为一列显示,# k/ c8 m  B' V6 ^0 v0 U
        )
    4 J% z0 I/ N9 E0 a
    ) v0 n3 ]  V9 ^0 a; A" d  f
    # F: a- n% E2 H3 j% z- N" U
    / ~4 |/ w* ^' ^# L1 G

    - m/ {5 U- ^3 h" simport matplotlib.pyplot as plt5 U" Q; n' y  `2 f5 z% d9 I1 ^
    import numpy as np
    * r5 C6 p# _0 [( q+ c$ owith plt.xkcd():
    ! `9 o) ?2 ~, }    plt.figure(dpi=150)
    0 O+ D$ p' T, `% a) \0 ^    labels = ['Jack', 'Rose', 'Jimmy']
    * f/ N# N4 Y6 g& x) `    year_2019 = np.arange(1, 4)
    7 R" }/ k& _7 e7 T6 P& A( |# q    year_2020 = np.arange(1, 4) + 1
    . H0 f! `0 e$ a8 V( w0 f' N! j    bar_width = 0.4" R* Y, f. v4 L

      _# f& N( ^8 y- s5 ]  q! g- |    plt.bar(
    8 x/ U: h& I6 c" g% D% ]& b$ u) [* f' m        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    ( ]& F# |" B# C        year_2019,
    % r. `, y: A; z% Z        color='#dc2624',
    9 s! }2 I' I: I% ^2 Z& h        width=bar_width,* |: b( Y, |7 R4 Y5 B, B/ p
            label='year_2019'  #图例. \) ?4 ~/ Z/ H+ R7 q9 a
        )) G, f3 J4 n/ x" n. H$ [7 T3 ?
        plt.bar(
    ) p7 J1 G- Q. |1 L" F        np.arange(len(labels)) + bar_width / 2,
    4 |% j: {7 Q0 Q3 ]        year_2020,- `2 G3 I  O+ W6 t  F
            color='#45a0a2',0 a0 V' V1 Y8 K+ R- U
            width=bar_width,
    6 }4 n2 z" C: C        label='year_2020'  #图例
    / l" ]7 b8 B) P; x) o* B3 k    )
    ; V% C: A  \9 _    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称
    5 F. i0 A/ y+ ?. _# n9 X7 A    plt.legend(loc=2)  #图例在左边2 ~! f5 `9 c; l0 O
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 : v4 _6 d4 ^/ r% F9 ^
    ; |: `# o3 m) @

    3 T/ Q( v8 X  @* }/ L6 _$ m4 O  U  t! \/ J
    4 x0 v% l1 c7 q
    ; y5 y- J: {& s$ J% v

    7 [2 ^9 L0 _* Y! p+ |% R! V以下参考: Python可视化|matplotlib10-绘制散点图scatter& q3 O' R3 M. d: f/ Z2 O/ Q

    / _: x. I4 e4 B% @8 z# K/ e9 O
      a, i) x4 r* c$ n! g
    import matplotlib.pyplot as plt
    $ z+ U( G# j6 q$ E6 u2 |import numpy as np
    " S/ U$ g! }4 ~# kimport pandas as pd4 ]% ^+ p# l1 e7 |8 c
    from pandas import Series, DataFrame
    , e1 l% m5 |$ _- ]#数据准备1 b0 d2 o2 I" H5 g
    from sklearn import datasets
    3 [- z' P. @! S" ?$ V1 q- P) t
    , S0 T, ~( t4 v2 ^- _1 Siris = datasets.load_iris()
    % W! D, j" Q* F" Y$ b$ ?" Jx, y = iris.data, iris.target
    ! _8 J1 O0 L' e8 s/ w5 \/ s) Apd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
    ; w8 A7 z% q* {3 A& q4 |5 w9 ^                       columns=[
      z7 m/ m, }6 {( y7 t                           'sepal length(cm)', 'sepal width(cm)',+ F9 m5 ?* `0 M* n
                               'petal length(cm)', 'petal width(cm)', 'class'
    - w& ~) {8 `0 i2 [" R* a                       ]); y  S6 f+ x( M3 ^
    with plt.xkcd():
    2 c8 S1 B3 c) e/ e6 Z4 _ ) w- V: h9 i. J3 F9 F% w7 z
        plt.figure(dpi=150)  #设置图的分辨率1 H+ c7 J- H# ?4 L/ _: h, P$ N4 Y
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图% P5 l) @9 ~) Z8 X2 M9 x
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类* z5 E0 J: S! R- ^6 o
        iris_name = iris.target_names  #获取每一类的名称
    5 d+ D. N+ I4 w: T0 ]    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色! U! e' z8 U/ V0 T
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形
    2 c) E4 S" S, h8 g
    ) d- G6 X7 `1 S    for i in range(len(iris_type)):2 L" o" S- b0 k  D
            plt.scatter(
    + p' a  q$ b, m' N5 Q! q: S$ l            pd_iris.loc[pd_iris['class'] == iris_type,
    , K1 _! A& _! x" f. W                        'sepal length(cm)'],  #传入数据x" G! `, u  J8 X$ @
                pd_iris.loc[pd_iris['class'] == iris_type,5 {! e4 R2 L4 Y: A4 z( g" D
                            'sepal width(cm)'],  #传入数据y
    * n5 V, \: y' T# o/ l$ h1 J            s=50,  #散点图形(marker)的大小
    6 O5 B( G" [7 M+ G            c=colors,  #marker颜色/ A; ]2 F* ]9 V6 _$ E) E
                marker=markers,  #marker形状# I4 y" r4 B8 ~- ]
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    4 A( U% _8 E  l" G3 P  W            alpha=0.8,  #marker透明度,范围为0-1
    8 U5 T5 U( F6 A; b            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    ( [! I; _5 G& ?            edgecolors='none',  #marker的边缘线色( \8 O% H! ^' L/ a) L4 y
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    + @5 M$ n/ t: C; p  q2 c" _            label=iris_name)  #后面图例的名称取自label
    1 L- f5 ~; H9 S) C8 A4 K4 }3 n ! G6 Z; ^: q+ L. m% H- c
        plt.legend(loc='upper right')
    - t) {# a. |$ q. R
    8 ^  J! V6 z# b- |
    5 q2 L/ C0 G; \6 |; t3 [8 I, U
    ————————————————
    - n5 G3 x- _/ {1 q! ~0 |9 e版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ; ]8 c. _) K' h: p/ w- d/ B6 c. w原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
    % ?# j7 x, G1 c- W& `4 g( B0 j6 q

    3 q) S( g" m( x, M+ g# N+ I4 {
    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-4-19 10:58 , Processed in 0.454681 second(s), 51 queries .

    回顶部