QQ登录

只需要一步,快速开始

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

    4 g! R7 s7 V2 [5 D& D$ ~7 N+ V4 C* b一行Python代码有多强,可让图形秒变「手绘风」  l" D% t8 m7 G
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    ' V/ ]: G" d  O9 \% T  R
    - ~' V. u: _; z2 S3 V0 \6 F

    , J& ~% a% B0 [2 j7 k但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    & D8 a! Y$ `! ^  V
    * Y. F/ ]7 Q+ v# o9 B
    3 d# U- q; }0 R, \/ B' w0 b
    matplotlib.pyplot.xkcd()简介
    ) I  J  Z* q% y1 L7 }这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小% e% b  O8 D* }- E
    , X1 W6 f* j6 d$ B9 v) ~9 X

    + h4 g% e9 N% r7 Q! o0 Pmatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度* R' Q, |4 [! {* v+ d" O- Q
                           length=100, #褶皱长度+ |0 ^- g: R* h* B
                           randomness=2#褶皱的随机性0 S- }, w/ p+ b) u* `6 k1 Z6 u2 F5 p0 z
                          )0 y' a  v) M9 r9 g
    matplotlib.pyplot.xkcd()使用3 g1 b2 d' @3 K" c- ]* x
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~( K; |0 W8 K8 e% ~1 d% f9 ]& C' o8 k

    5 Z% Y. I6 _/ Z7 w( f  W) v
    % q& E+ m# T& I6 K) k
    with plt.xkcd(scale=1, length=100, randomness=2):: P, ?( r( l0 Q" Z0 |
    #with是临时使用一下,不影响其它图使用正常样式. Z8 W! m, ^) f4 C
        绘图代码% Q& y( i5 g2 B5 P4 s' p
        。。。。。。/ J. w; z7 H+ X3 L4 ?7 p6 A
        plt.show(), B2 C  y. A! J
    matplotlib.pyplot.xkcd()使用实例
    . l  }; R2 r7 R, B下面代码为pythonic生物人公众号之前的文章代码
    4 P3 ?. n& U: z! h9 x' Y3 P/ ]7 ]. o" q7 q4 G% A3 V
    ; e4 |1 |2 I- n8 Z9 @
    以下参考:Python可视化25|seaborn绘制矩阵图3 Y  `7 d! ^: A7 Z
    6 `, @% n4 o: l2 z

    : ]: z' V  j3 K/ T1 U4 x( g#支持seaborn6 q& f! B% {! M8 U. f% ^! F1 C
    import seaborn as sns
    # b1 s8 ]6 m; B, w0 s( p, Y" Tiris_sns = sns.load_dataset("iris")
    ) p3 X7 L( h6 H4 gwith plt.xkcd():
    0 H* l" `. t6 o4 Q& ^2 n/ \% Y$ n    g = sns.pairplot(
    ' i' y# l; ?3 K4 E% B        iris_sns,, Z3 v8 g9 C) c
            hue='species',  #按照三种花分类
    ; X% u3 _  ?2 r. u; q$ |# n        palette=['#dc2624', '#2b4750', '#45a0a2'])
    6 k; |, d5 Y9 _4 f  p* E- Z; h) ^    sns.set(style='whitegrid')
    & K9 j/ E( K2 c6 Z4 `' A    g.fig.set_size_inches(12, 12)
    ; i5 K% G9 Z" c+ N0 Y    sns.set(style='whitegrid', font_scale=1.5)
    ; W# }- Q$ W, u% s- t& {  
    . [" y. B- {5 h# a8 O# L2 H5 |# e  x. F* U: G) s

    0 w/ w* Y+ O& x# m% a4 I/ x4 \+ I以下参考:Python可视化29|matplotlib-饼图(pie) + ?9 [* e, \+ `/ b! S; A
    ) S' l" V9 i( R! e5 c! q: z+ V
    . G1 {3 f, w, T/ b) a# `" |
    import matplotlib.pyplot as plt
    , m+ [% W( u, ^8 g( ^- b6 z4 |with plt.xkcd(
    4 x- t+ m( r, s/ t4 q        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度
    ( U/ ?1 n  s" K& i9 F: A7 Z# D        length=120,  #褶皱长度1 i  u1 x4 }" ^, f3 g7 L+ D
            randomness=2):  #褶皱的随机性
    ' ~3 u: T/ m$ ^" k7 i/ I    plt.figure(dpi=150)2 E* z7 x: h9 G8 \5 E! w
        patches, texts, autotexts = plt.pie(
    1 q( ?, W! F, {8 g: d        x=[1, 2, 3],  #返回三个对象1 F/ h6 h+ A2 S% Q. y
            labels=['A', 'B', 'C'],
    . O! u+ M+ U3 }- g. d2 F* D7 O        colors=['#dc2624', '#2b4750', '#45a0a2'],
    % R# I2 a3 G9 n/ x& d  Y        autopct='%.2f%%',6 V& |6 A- j3 M5 f; T
            explode=(0.1, 0, 0))
    * @8 c. o% |( q    texts[1].set_size('20')  #修改B的大小
    ' Y  c9 I5 F, Z5 z0 P7 ]4 U' }- m/ I 1 I7 l, W( t7 p$ d# a7 {
        #matplotlib.patches.Wedge
    # M* g% F6 c% c. A- J2 {  W    patches[0].set_alpha(0.3)  #A组分设置透明度
    / w' U, `: _6 t$ b    patches[2].set_hatch('|')  #C组分添加网格线
    6 \) `: @6 K9 x/ @    patches[1].set_hatch('x')
      n4 ^5 S4 F1 n" I 4 R- i* k* }9 ?6 {8 [4 N
        plt.legend(
    3 X0 \0 }7 @$ S& |! a0 r2 [  y6 D        patches,1 i' @6 ]5 V: n4 H  W% r, C
            ['A', 'B', 'C'],  #添加图例
    1 Z/ }" B" L5 \. w" Y) ~2 n) r        title="Pie Learning",0 t* Q  K$ N9 t* v
            loc="center left",
    0 [6 N6 j! H; j$ t        fontsize=15,0 O& d2 T- K: k$ K5 o$ O
            bbox_to_anchor=(1, 0, 0.5, 1))4 g1 `) ]2 \! k) D0 O; {/ T

    : v- j1 B, q5 _- q- {    plt.title('Lovely pie', size=20), b  Q& V+ I+ l
        plt.show()( S/ T/ e/ ~' Q+ v' @4 i% _
    5 _0 }( B8 |+ ^6 D. i  j9 C

    5 r9 G, A: }; K) D2 d
    ( i2 ?! ^2 v8 d) f) v
    6 c# F+ w7 }4 A3 z
    with plt.xkcd():
    # R' y  t6 R! U    from string import ascii_letters: n# i# @! V! Q2 x& s
        plt.figure(dpi=150)7 O) K+ C3 o2 M3 I1 E
        patches, texts, autotexts = plt.pie(7 O5 j, f$ E8 J; N
            x=range(1, 12),7 A* V5 Y7 B! Q$ D  k. ^( W0 I) R
            labels=list(ascii_letters[26:])[0:11],
    # x4 U# w5 p" ?* }: B; l" Y6 T4 q0 ^2 n0 b        colors=[, A' {$ P; c7 }% |, l
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',$ N  ]9 T+ x9 C# s' u' V3 k
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    ) m. E4 I. N. Q3 s) E8 `4 u) L5 O        ],  L% H, s& T% S6 ]- [- a! V5 `
            autopct='%.2f%%',. j. }  Y" n. a9 W
        )$ t& @/ |# e/ F. y/ Y7 r
        plt.legend(
    2 H  n' ^2 I* i. S9 d        patches,2 y' U; Z# W; e* V% J7 |, r9 w
            list(ascii_letters[26:])[0:11],  #添加图例$ E* S" {: J4 z$ M3 G
            title="Pie Learning",
    3 E1 ~' x# X3 [, N0 p2 h, G- a' ?        loc="center left",
    - \9 _. q$ I2 w" ]8 P9 ~        bbox_to_anchor=(1, 0, 0.5, 1),
    ( Z5 B: {) ~2 L' B3 Y; \        ncol=2,  #控制图例中按照两列显示,默认为一列显示,. q* W& |8 i: S# J
        )
    8 m4 C" V/ `: k% h; \' d3 ]) E! P* H7 j$ W! n
    3 E4 F8 B4 A* p" A
    0 J# g! `; L. s1 ]

    , Q: ^! S. v* ~6 q5 \( uimport matplotlib.pyplot as plt
    / }& ]! l6 W( _/ m9 pimport numpy as np
    4 m8 u9 F) }! k! Q: ]with plt.xkcd():
    6 j9 U& D) x/ \/ j, f# _4 W    plt.figure(dpi=150). Q2 j- K0 m, f3 ]: w
        labels = ['Jack', 'Rose', 'Jimmy']  Q7 }( Z3 g) ?0 K  j/ m/ o
        year_2019 = np.arange(1, 4)% }- b& @0 G% ^# O) N
        year_2020 = np.arange(1, 4) + 1
    0 o+ o" o* Z' |    bar_width = 0.4
    / h2 v' m3 D- i- n: F : O1 `4 a+ C& G
        plt.bar(/ J- P2 t0 {& ~& b
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽+ T& W- k- m# v6 `* B3 e: S
            year_2019,5 T3 _/ ^+ P  A5 b, x
            color='#dc2624',
    4 T# R. Q: F; I        width=bar_width,. k5 H5 `, f( \) k3 l8 r( n0 m
            label='year_2019'  #图例& D) l2 Z/ E8 g, s* B* |0 X
        )
    2 e7 R3 h& Q, R7 O/ Z    plt.bar(
    * d8 w1 V4 |4 p! L$ A        np.arange(len(labels)) + bar_width / 2,8 W; h: `# F6 v0 k3 D
            year_2020,4 r7 g$ y- k0 G: U; }: y
            color='#45a0a2',
    : G7 _" e: h% U        width=bar_width,
    5 t' Y  M/ g& W        label='year_2020'  #图例
    ! N2 x9 I$ ~9 r0 o    )& J) Z; U* m" `3 U
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称1 c" G) K* }5 p4 _, ~+ c$ T
        plt.legend(loc=2)  #图例在左边& _' O$ \2 }* d6 v& |) r
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
    7 t) P4 a7 u' {* J1 f% Y
    ; e! r1 d* ?! G4 g) N5 ^

    5 q% `/ K6 [; m0 }( H  L4 \; m, h! G/ z( H: l8 e
    : q: F, b& K+ G' f+ ]% n
    : b7 w, e( [; j0 Y( x+ y3 T0 p

    " |; _+ A! @# x. C( J以下参考: Python可视化|matplotlib10-绘制散点图scatter# ~/ B1 Y& _" X% e" I
    ; h6 x4 V; H0 {7 v

    - t( \6 P: a  Timport matplotlib.pyplot as plt: e4 Q& f0 ?# |$ i( _& ?% Y, G
    import numpy as np8 L3 G. _- K! t! u5 C1 u
    import pandas as pd6 |5 f9 v! Z# F, q* O( C  ]3 s! P  T
    from pandas import Series, DataFrame
    0 r3 _% h) M) ]. ]  ~  D4 Z#数据准备
    ; G* Z' ~( q/ J& `0 bfrom sklearn import datasets: m5 F" i! E. c& y8 @
    ! e$ |; H) G- r/ I" d9 `
    iris = datasets.load_iris()( q+ X/ R2 G8 J4 x" z
    x, y = iris.data, iris.target
    + |' `3 t$ y8 _8 i9 }% p, Q& v" ipd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),+ F. @# V3 y* c1 e) O7 j, k: ]
                           columns=[8 x! a4 Q) ?% _& z' _
                               'sepal length(cm)', 'sepal width(cm)',
    6 N- e5 M3 w, ?' A8 j% n7 ]; N( _                           'petal length(cm)', 'petal width(cm)', 'class'
    4 H8 G' Z) [$ @' B% l4 |, X9 `                       ])4 p/ r1 e* e; F9 _; B
    with plt.xkcd():
    / D0 g2 d+ ]  ?, d( I0 n ; M  j; U5 @4 D* w$ r3 ?
        plt.figure(dpi=150)  #设置图的分辨率/ o$ e, Y3 ~. S; m3 ^3 o- s& G
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图* y: V! x' I3 D, ?
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类7 u" Y1 s  k7 W& P4 F) ], ?7 y
        iris_name = iris.target_names  #获取每一类的名称
    , U$ P: R- T5 Y* O' w. F    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
    : V% b4 d  h9 A    markers = ['$\clubsuit$', '.', '+']  #三种不同图形
    : V( G9 w7 c# l2 b' p. g 6 E$ B+ ?! S) |$ F0 X
        for i in range(len(iris_type)):( }4 D, [8 l: ?+ F! T3 {$ j
            plt.scatter(
    : x9 m) J. t* E9 l            pd_iris.loc[pd_iris['class'] == iris_type,
    9 X, V: [) |3 S6 l/ V                        'sepal length(cm)'],  #传入数据x
    ! q5 D( c  d  f! j) B3 ?- d9 q. \            pd_iris.loc[pd_iris['class'] == iris_type,
    - m3 f! z" _8 H! V1 p' U                        'sepal width(cm)'],  #传入数据y
    ; m5 I- a- V: c3 N            s=50,  #散点图形(marker)的大小1 [; |% H0 r8 P  [$ E
                c=colors,  #marker颜色0 n$ b! Z+ x: w- S: R% X0 w
                marker=markers,  #marker形状
    % X3 q# t9 g% H0 O: Z; r( L) o            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    + u  y2 X) a# r4 ]# M            alpha=0.8,  #marker透明度,范围为0-1
    6 `2 T" a, n8 d3 d4 [            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    , p+ k* F' ?# c) ]4 I8 d2 t/ W( `/ [            edgecolors='none',  #marker的边缘线色
    7 k- ]2 }& U& d. e, M            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    : I+ C1 w/ B8 X$ g+ M! o( ~9 }8 K- J            label=iris_name)  #后面图例的名称取自label6 R. c. t6 r% f0 J

    9 j& ?0 F4 H3 O) c    plt.legend(loc='upper right')
    2 [* w' R% a) e' P2 t1 F  z$ c! V, _7 Q( v3 ^7 O2 t
    3 b& z# h0 I% U% a) w
    ————————————————
    " B4 m9 m; v& |! D版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    6 {5 Y1 O) W: N0 }+ N原文链接:https://blog.csdn.net/qq_21478261/article/details/1189637532 o6 }2 A# r- C5 P, h
    3 p1 ?8 ]9 v9 v  J4 M" M9 O- V, N
    * Z  {, r4 i1 g
    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 12:43 , Processed in 0.432183 second(s), 50 queries .

    回顶部