QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6241|回复: 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
    ' \; Y! g$ K$ Q  F
    一行Python代码有多强,可让图形秒变「手绘风」5 y) Q7 b  F9 a
    之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具* r+ @; x+ P) x$ W

    . @- N7 D* Y9 _2 o" C. A, o

    ; K$ v" D6 k* J) b8 h% ?0 R. o4 {: R- f但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    7 a, l' r# N0 r7 ]
    / ~; n6 o: ~* r( T& E

    2 X3 S7 p  q- n& F2 mmatplotlib.pyplot.xkcd()简介
    - I- V4 X, W2 g, S. J这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    # t/ ^9 R: ?* I) A, A/ G: Q1 s; y6 H
    0 e6 x; j5 M# F) r- Z

    $ C4 \* @: ]5 Jmatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度3 Z+ \1 y6 u4 b3 K8 O- b+ T$ A; y
                           length=100, #褶皱长度$ a4 h: @& k5 x5 d  @% p
                           randomness=2#褶皱的随机性* L: O% W( z+ `7 P; h: G5 w# q
                          ): d+ B/ z( b: e* p/ }* q
    matplotlib.pyplot.xkcd()使用; j9 T& T& ]5 [* x8 |5 V9 R
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~! a3 W" A& Z0 S# H0 v

    , v! G) z- B' Y( M; W2 [

    7 `! j9 o/ T3 e0 H& vwith plt.xkcd(scale=1, length=100, randomness=2):
    3 Z' n* R( t; X2 r#with是临时使用一下,不影响其它图使用正常样式
    2 l( B( S0 S" |* u' e: O! A% w    绘图代码
    7 T1 _* Z" b- x# }4 e    。。。。。。
    : l& \6 J6 y0 G9 M    plt.show()
    % F2 _6 h. F! Y# bmatplotlib.pyplot.xkcd()使用实例 9 P8 t. H* _* C8 V/ l& M
    下面代码为pythonic生物人公众号之前的文章代码
    ) m+ U. g1 ?7 `
    . ~4 t1 R: n+ Q' ]# b# D# H$ {

    - v% L+ q) A/ I+ p, [以下参考:Python可视化25|seaborn绘制矩阵图
      Z+ I5 J# D1 o5 [, W9 Z4 R2 b& ]3 u0 n, f
    ' w4 d9 J' b$ c8 x+ R/ F5 P
    #支持seaborn" W3 h8 Q$ _$ {
    import seaborn as sns5 H, U. L  u( l0 l' n, E
    iris_sns = sns.load_dataset("iris")4 d3 v+ g- E# O6 d' S6 R
    with plt.xkcd():- l. h) w+ ^/ T. F
        g = sns.pairplot(& Z. k1 l! h; u' q  B2 M6 z
            iris_sns,
    5 L2 O1 o, _5 q5 x        hue='species',  #按照三种花分类
    # k/ V* @# y0 S8 T# ^+ i        palette=['#dc2624', '#2b4750', '#45a0a2'])) F* b! P9 `: Z# l
        sns.set(style='whitegrid')0 v+ S$ Y" K5 {4 ~4 z  J5 o
        g.fig.set_size_inches(12, 12)
    1 J' j) t( r% |: @1 A    sns.set(style='whitegrid', font_scale=1.5)
    * W" m* ]6 ?7 R) g+ ]+ Z" D) _  
    3 ?* s+ @' Y! U$ f4 c3 @; e; K
      R  P( p2 v6 x0 u$ S
    8 U) G/ O1 B  {/ F
    以下参考:Python可视化29|matplotlib-饼图(pie)
    * G! Y6 }+ I, g! P+ `4 ]: U7 k* ?) U+ @+ i/ q4 T$ w

    ' \2 [" \% g0 N: Limport matplotlib.pyplot as plt
    & j8 `, u7 l2 N# G' Ywith plt.xkcd(1 w; F2 n" n4 |, E6 n
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度6 L, `* J0 N2 \& j6 m% o7 [# N
            length=120,  #褶皱长度
    * S7 Q% D9 x. Y+ C  e        randomness=2):  #褶皱的随机性+ Y6 Z5 c( }, {, i
        plt.figure(dpi=150)
    ) @! M" X% o1 u7 S6 F& H    patches, texts, autotexts = plt.pie(: s& Z3 _- d/ M8 k
            x=[1, 2, 3],  #返回三个对象# u+ o: z( s/ v+ \7 E* ~$ V
            labels=['A', 'B', 'C'],
    7 h, i7 Q3 C: l7 T# E9 P; a# t        colors=['#dc2624', '#2b4750', '#45a0a2'],9 ]+ a: b, e, v; y' V  C
            autopct='%.2f%%',$ @$ t. q$ c, K4 W, I
            explode=(0.1, 0, 0))
    % v# i7 _/ Q! ?# [    texts[1].set_size('20')  #修改B的大小( |/ R, T* E6 \  s4 e
    + F2 p5 v; r0 p( `/ V
        #matplotlib.patches.Wedge( m6 X2 R: b8 n  ?' z& p
        patches[0].set_alpha(0.3)  #A组分设置透明度
    # S1 Y& ]% E7 ^- E( r    patches[2].set_hatch('|')  #C组分添加网格线
    2 `6 i; P: u  L/ {    patches[1].set_hatch('x')
    6 h' U0 W" s0 J* [   g  N( B; R% r2 a. I; K$ w
        plt.legend(
    8 A; P/ w8 f2 P: L2 i; g4 Y        patches,
    ; I* S9 i6 E3 U# }4 f        ['A', 'B', 'C'],  #添加图例) h) o% b; ^4 Y  [: Q
            title="Pie Learning",9 D3 D* J+ m+ y4 @2 U9 w
            loc="center left",$ j6 |+ C$ o$ q4 N
            fontsize=15,( k9 X4 ^0 ?3 J# W. R' ^
            bbox_to_anchor=(1, 0, 0.5, 1))" O5 {: V) L. |

    . z. W) B9 ~8 s! L( A# R% z1 o    plt.title('Lovely pie', size=20)
    9 i# c0 A* _) T& s! S! h7 U( c    plt.show()
    * u$ Z' k, m5 Z6 v9 L
    7 r: l- k, |8 H' N
    ( d' o9 A8 w0 v6 [! M( B
    6 {! F" ^8 l" Y

    7 A" r% l. t( D9 ~8 I# [/ [with plt.xkcd():: o# B6 \3 P/ Q- l" c
        from string import ascii_letters
    / K7 y. a1 p" ^* I/ m8 R+ Z( \    plt.figure(dpi=150). ^0 ?* j( B' Q; ^5 A" c, a: B
        patches, texts, autotexts = plt.pie(+ c3 w( d. u+ C7 S2 z: b0 B) b
            x=range(1, 12),. e6 s8 y+ ^; z9 V8 i' t1 i7 O$ }
            labels=list(ascii_letters[26:])[0:11],5 D6 F3 O. B9 n3 B1 x2 U& R3 y
            colors=[
      d& M. }, H( y0 R3 y            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',5 l6 Z* B/ w* e0 o* u. L
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    5 |0 M8 y' J$ h* `$ C) R8 n        ],  J9 ^# U, [( L  z$ N
            autopct='%.2f%%',& v& v- e# e9 r, m$ e9 G2 a. c0 _
        )
    * l% S& x/ I, z- N/ L+ i    plt.legend(
    # V. A, A9 ]7 f        patches,
    1 {; [& [" t" i6 C        list(ascii_letters[26:])[0:11],  #添加图例8 w# H4 {  e8 I4 G" ^7 f7 |
            title="Pie Learning",
    2 h6 I7 E. _) a( u        loc="center left",1 S6 q. c1 ^* R  c/ }- p5 C
            bbox_to_anchor=(1, 0, 0.5, 1),6 H/ [: l1 E! V, B$ f
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,0 [3 T) }" M" [" N- W5 s  L- y
        ). U% X$ d6 I* ^8 h9 ]2 w( N# X+ Z

    + g% ]3 j* U6 D5 a

    6 J7 H+ S; B( v% Z
    % N  y: s$ \+ H5 `( ?8 B

    0 C6 t7 u- y/ Q2 r" e3 aimport matplotlib.pyplot as plt
    - i& h- o; }5 Pimport numpy as np. @3 i, L! T9 F+ F) N+ V
    with plt.xkcd():
    5 B( R4 g' ]& k2 `. f    plt.figure(dpi=150)2 k6 L$ g9 ]6 ^6 W# S; M" F% h
        labels = ['Jack', 'Rose', 'Jimmy']2 Y) F  r( v- n* D' U' R
        year_2019 = np.arange(1, 4)
    6 W, }0 _3 Z2 D# c7 K; Q    year_2020 = np.arange(1, 4) + 1
    $ @9 n, l2 N4 R! E, q    bar_width = 0.4
    $ a+ Y3 t1 L3 R2 [7 z3 g6 J! ~$ t
    8 ^- V* Q" U( H. o& b# S+ C* p    plt.bar(
    # U8 A' X# F5 ^" D  n3 [        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽: ~8 p* R  K. g3 d" O
            year_2019,( {& ~# E1 P3 ^" W/ {
            color='#dc2624',
    4 Z% H5 t& p6 J0 v        width=bar_width,7 a9 R0 k# r: c" m, R, S
            label='year_2019'  #图例% @$ q/ X: D: }3 Z2 q- W
        ). Q6 ~5 x$ Q+ D) H, b
        plt.bar(- a  w0 R7 u3 O( k* ]7 x) ?% z( Y
            np.arange(len(labels)) + bar_width / 2,
      {% Y4 g/ N% p" a) y: x1 y5 j        year_2020,
    6 r7 R# w! v6 @0 f        color='#45a0a2',
    2 L- }+ e* ]9 e# Q        width=bar_width,
    4 ~" M( ^) H4 K, [( J$ d# b        label='year_2020'  #图例
    ) y  _' P: ^9 X/ J$ _/ l" A    )
    ! i& L9 \+ \- T# u5 ^: B( C9 k6 A* B    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称( h5 \3 z; n/ d& j1 f
        plt.legend(loc=2)  #图例在左边; o5 d6 {1 R+ N% t2 P9 @
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
    ; {) Q& I$ e$ O' z, H! G8 m1 k" c0 x

    8 q4 x1 E6 x* a2 U. ^3 \' S+ v% `8 e& h( v& a* d8 W! D
    6 A0 ~7 U/ x6 D' _; n
    6 _# d1 ^8 R( N- b
    & S! V) }# i! x, q" F  E; ?
    以下参考: Python可视化|matplotlib10-绘制散点图scatter
    0 z2 L- V; p1 ~/ h5 i. c! e/ X8 L
    ) [* s( j2 a2 a2 }# H$ q& t# l
    ' J* T( S$ m8 u6 g4 U
    import matplotlib.pyplot as plt
    $ s2 Z" L- J" h! \& Y1 l4 l/ T: {import numpy as np6 ~. G" \- \9 l5 T
    import pandas as pd
    7 t/ d- c# d5 f. i: x7 ^from pandas import Series, DataFrame
    ; p; @- G! {$ K. B, ^; X" }8 m#数据准备& M2 M, p* Q- @* L, F( q
    from sklearn import datasets
    % d7 R6 r8 {2 I# V! l# _
    ; H7 G* n3 I2 ]0 C; w; A2 X- g" Kiris = datasets.load_iris()
    3 z# t$ m! [; G* ]x, y = iris.data, iris.target
    1 y# \( `' L7 B  h9 {pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
    3 `: j6 j# m1 B& \6 D+ Q                       columns=[& |0 _: r% c  k( E- U; z
                               'sepal length(cm)', 'sepal width(cm)',; v9 m; q0 v4 D  w
                               'petal length(cm)', 'petal width(cm)', 'class'
    ' O  s  y( r; `                       ])% A8 I" o8 ^, a1 q1 q7 `/ @" [7 ^# ]
    with plt.xkcd():
    " H8 [. Y7 F8 [  d9 } # _) Q0 x) H6 z4 R* b0 h
        plt.figure(dpi=150)  #设置图的分辨率& \# S' B' m) X: l. @+ B( I3 T) f
        #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图: B5 ?! ^7 y& z. B
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
    6 R$ v: L+ d; b8 @    iris_name = iris.target_names  #获取每一类的名称
    1 \( [# M% ~3 g( L    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色/ x- k9 D9 \& Y
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形7 k, }" R# I( d
    $ z; V" B+ j- s
        for i in range(len(iris_type)):/ e# G, ]3 F6 z- |% Z# w% g3 q
            plt.scatter(6 N! E* ~- i9 _4 _
                pd_iris.loc[pd_iris['class'] == iris_type,
    & j% U& a, B$ E5 g                        'sepal length(cm)'],  #传入数据x
    / \" q; \+ P) S2 ?            pd_iris.loc[pd_iris['class'] == iris_type," K4 M3 ~4 _3 Z5 @/ @, B; _/ t
                            'sepal width(cm)'],  #传入数据y
    6 s* c: `2 K- ?) Y( h% v" N5 l9 \            s=50,  #散点图形(marker)的大小
    ; L+ z" Z4 B* W            c=colors,  #marker颜色
    ! `3 r# V0 e& T5 W  g' g7 V" ]! v            marker=markers,  #marker形状
    # C6 D+ ]2 Z) [( |, j            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    2 N& Y8 O9 j  C! g8 }8 N$ W6 ^            alpha=0.8,  #marker透明度,范围为0-1' g0 T! ~; O1 ^; R  h+ n
                facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c: [; S, {; h( h; z; {
                edgecolors='none',  #marker的边缘线色
    ( Z" z2 Z+ [% ?  c5 F            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    $ `, a( O) R4 i            label=iris_name)  #后面图例的名称取自label
    7 d* Y+ N, `; c+ l: ^# ?# |* b# c0 ]
    , {) ~' U# I) W2 c1 j( H- s    plt.legend(loc='upper right')) c- }* L$ |$ k) c. g& f1 ~- }2 o
      Q  b6 S: m4 H- t4 O6 f
    ( r7 R' f' L) P
    ————————————————0 P, A8 y5 D% I
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# b; Z$ `" I5 V
    原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753. Z2 y) Q/ i9 p3 A2 G! v

    0 F9 V/ @5 p1 ~9 P7 U) p7 U
    : m, T5 ^0 ^5 R9 v& S$ J
    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-6-2 23:52 , Processed in 0.384838 second(s), 51 queries .

    回顶部