QQ登录

只需要一步,快速开始

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

    " h2 _  h: x' t+ {+ i. L9 k一行Python代码有多强,可让图形秒变「手绘风」
    3 @3 F, j( R& o( x) N/ l( h, l% K) U之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具: V/ u* g+ c$ [' r& z0 r  q
    8 B* r/ g- @: h5 q

    , \2 W9 \7 U, l3 g( a# X4 E+ u但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    ! c1 u/ l" y, W9 y0 \  v3 L) a6 ~
    , H# c4 J" T0 _& ~& F+ |" A9 Y
    1 }' ?' X+ X' C* a5 n! |
    matplotlib.pyplot.xkcd()简介. K- N8 O$ a5 X% ]2 H5 v
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    * v9 H3 r3 [2 o$ F" s+ F; `% s0 o" D7 r
    & [, K3 d+ a  ]6 |, f* U3 c# D
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度' R- D% i# p7 ^( G$ y; M; X
                           length=100, #褶皱长度7 {0 j- [7 M/ a& x- ^
                           randomness=2#褶皱的随机性
    ! J5 w; y% K% q# W7 A  V                      )% k& D' x7 Q) _: _* ]9 `* c
    matplotlib.pyplot.xkcd()使用
    - X$ P$ `9 f0 U# _$ g如下,加with行代码即可,括号中参数按个人喜好决定是否设置~, \6 I, J) i" }7 E

    + Z+ f+ w' l" b
      ?( Q2 s. i' A4 h2 T" U; D
    with plt.xkcd(scale=1, length=100, randomness=2):3 ]. t" O) [, S: Z" B
    #with是临时使用一下,不影响其它图使用正常样式
    5 z. }5 r2 d8 Z. p: u& F    绘图代码
    9 r6 |3 h1 O/ G) |% B- B    。。。。。。
    ( Q) C9 _. J9 {- Y7 J    plt.show()
    5 @" |- K* l" h% d: e% gmatplotlib.pyplot.xkcd()使用实例
    - ?, j& H6 k) s' J- o! s+ t& K0 a下面代码为pythonic生物人公众号之前的文章代码% V+ U/ T9 O6 D" X9 r  }, O) Y

      B7 [* _9 _+ ?- L; b6 G) R
    7 F' m# B/ y, J% U
    以下参考:Python可视化25|seaborn绘制矩阵图
      ~& e+ d: l; o% v8 e/ Y; {, E; i* E0 Y: d" ~

    - q' q7 [/ y% C$ Y: o#支持seaborn% q/ x$ i* }8 A4 y& h2 \
    import seaborn as sns! R$ R+ B0 V: e6 k
    iris_sns = sns.load_dataset("iris")
    : b/ a; ?9 }. R! ]with plt.xkcd():7 \" D; d5 w2 |
        g = sns.pairplot(8 Q7 I3 Q9 C8 y$ Y5 h
            iris_sns,+ v* [8 M9 F: l4 Y3 i( V$ M' I
            hue='species',  #按照三种花分类
      i" o" e' I0 Y( V! r/ G" Y        palette=['#dc2624', '#2b4750', '#45a0a2'])
    9 ?; q2 t! q& s6 u) P    sns.set(style='whitegrid')6 R  ]" Z5 ~' D  u0 A7 P
        g.fig.set_size_inches(12, 12), C5 o/ U8 u* }+ x! A. Z
        sns.set(style='whitegrid', font_scale=1.5)" d, r* b0 E2 g  _$ j
      ; a7 g3 s1 ^, J, N; Q0 J  U8 O
    # S+ `/ c% k- e6 l% Y5 N

    * C: i3 s  d4 _7 x' [以下参考:Python可视化29|matplotlib-饼图(pie)
    8 B% ?; {2 ]% r# [- _5 ?. t: X$ Z1 K+ V: e

    % Y$ W1 K2 b$ N% U' Q: |import matplotlib.pyplot as plt
    , @, v' D4 c/ C7 _4 W5 k' E4 qwith plt.xkcd(
      ^/ C; y% s- K        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度8 K$ i. R& }/ P# O8 R# D8 B6 F( ?
            length=120,  #褶皱长度
    & X3 l: J$ a- I+ V" F/ S, X! r. ]        randomness=2):  #褶皱的随机性: Y5 |2 @( E0 q+ t5 E4 o  g
        plt.figure(dpi=150)
    5 T4 U- @4 R" x, H    patches, texts, autotexts = plt.pie(
    0 U4 {# |- L- {! o, v3 s6 ?5 d        x=[1, 2, 3],  #返回三个对象6 ^5 o' }) a! R
            labels=['A', 'B', 'C'],
    1 H, X0 h4 U) |& [- s+ O5 |& ~        colors=['#dc2624', '#2b4750', '#45a0a2'],
    % W$ s, \6 F1 D        autopct='%.2f%%',
    2 _4 V9 d4 u+ ?3 O* V        explode=(0.1, 0, 0))
    # W! e+ U& ^" j$ U, M6 w" i4 D    texts[1].set_size('20')  #修改B的大小
    ( J; a. t! L" b* B) v % ?; n5 O) O" C7 j
        #matplotlib.patches.Wedge
    7 ]' `& R# r7 v4 _    patches[0].set_alpha(0.3)  #A组分设置透明度
    " T- S  m1 ]" ]* i6 \7 [0 z    patches[2].set_hatch('|')  #C组分添加网格线) _0 k* z6 N' l# m) W; x
        patches[1].set_hatch('x')2 V, o( v  j/ E, ^  d0 x& x/ Q& l
    * c7 S$ a6 ^' B9 Z
        plt.legend(
    ; c8 u0 W4 a* i4 s        patches,2 k5 W: F  Q" t6 q3 [$ @1 w
            ['A', 'B', 'C'],  #添加图例! a! v9 G% ?7 g3 U
            title="Pie Learning",
    " p. n. B1 b( |# G1 i        loc="center left",, F6 ~& W+ c7 w! J: {
            fontsize=15,4 d  v5 K5 @' R. n. S0 t; F
            bbox_to_anchor=(1, 0, 0.5, 1))/ v- W' t1 M+ G2 B4 f9 [

    & e0 Y! |$ f' a4 ~    plt.title('Lovely pie', size=20)
    / Z( M' d8 b: }# o/ I+ Q+ I    plt.show()1 P4 h5 @' x4 w2 [; Q4 r

    ( a- K' J9 F# z" p. ]0 w: m! U: n

    : t9 B- _; u7 y0 Z7 i
    ' }% c3 V  x% v: H$ c

    $ X4 f3 f' w" R, [* ?" |- w1 V$ d3 m  nwith plt.xkcd():' l( t& F8 y7 V$ V
        from string import ascii_letters6 u  x; S# g1 i* z$ U# q
        plt.figure(dpi=150)1 i/ E0 a0 v: ^+ u( p. }
        patches, texts, autotexts = plt.pie(
    9 A8 }, ^4 p" o, O0 u# ^        x=range(1, 12),
    9 Q! U* ^* j" S; y; S# u! N+ t        labels=list(ascii_letters[26:])[0:11],
    ' ?" y. w* |' N# ~( K        colors=[+ T* u6 L  o/ d* _) i' N
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',) w% f8 Y  Y+ H# ~
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'* W& h4 U  B/ C% c( F: n' T+ O& Q
            ],* }3 l1 Z( A. i, S/ O( b# o
            autopct='%.2f%%',
    - V% L) G8 R- j# K8 C/ Z    )
    / L3 o& H) N+ R5 I) Q! E+ ?7 ^6 C    plt.legend(& I; A. C" @3 v+ g# i8 [0 f
            patches,
    / r* b* n) S. W/ E  W! F5 Z* h        list(ascii_letters[26:])[0:11],  #添加图例# P& p2 s1 S4 I& a/ z
            title="Pie Learning",, w+ \  X0 y: F% [5 _8 p
            loc="center left",& \3 y2 m4 N: ~% Y& s
            bbox_to_anchor=(1, 0, 0.5, 1),7 w2 P6 z( o" a
            ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    # V2 C1 m& U0 I$ j2 A* G  _    )5 c7 I8 f3 v  O' }% {2 S
    : m+ M/ T6 W0 p, d% t

    & A" Z. q6 E7 }& [( z9 E
    + a, N+ \& Q# Q: k8 ?2 d# ?
    . t- K$ H) O  s; ]. o8 K
    import matplotlib.pyplot as plt
    . J/ U- O* s6 @" J* Y; l4 himport numpy as np( P/ I7 C5 Q9 Z0 R2 ?
    with plt.xkcd():1 q. n" ^8 U8 H( C/ }, |8 w
        plt.figure(dpi=150)
    . c% h! V/ z* M& \% h    labels = ['Jack', 'Rose', 'Jimmy']
    ( r) O6 w5 b  r% M# ^    year_2019 = np.arange(1, 4)) I- L+ ?" @4 B6 F- ]3 M
        year_2020 = np.arange(1, 4) + 12 E# k5 j  W& K
        bar_width = 0.4
    , j7 V3 y( A; a( y! v! w( @3 |% \
    8 Z, S/ f6 s3 C. Z  q- k    plt.bar() V1 Y. q/ W2 m4 V6 A
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    2 v1 w9 p: K. P6 K5 l( }1 O  e  Q        year_2019,
    ' m7 r- e3 v8 x. B7 K: p& u! P        color='#dc2624',
    % Z* e6 g0 j+ D4 _3 f9 H1 l4 r1 e        width=bar_width,
    + \8 z. E7 z: [$ [( [        label='year_2019'  #图例
    % Z1 ~( H" n9 n) x, P    )0 @  d( k8 P. n( K: t4 t
        plt.bar(
    8 U; |  W9 s9 f1 ?$ H        np.arange(len(labels)) + bar_width / 2,! H7 G7 K  |/ ]/ d9 h2 a- R
            year_2020,
    / j! V* Y" k& n) L4 B% P        color='#45a0a2',
    7 l/ o% T% W5 n/ \, q% O        width=bar_width,
    ; z4 L+ ~7 u  [. y7 T. b0 e        label='year_2020'  #图例+ Q& p1 ^2 A! x% M; r
        )" N- j# L5 t1 k, l' b' m% X0 h: M
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称6 b( E3 \8 p, U, w" E& [; H: X
        plt.legend(loc=2)  #图例在左边
    8 x( v6 }4 s) I$ l1 V* K以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 . M" P: `9 L: o- q- ^* o. p

    1 v  W' t3 C# L* B/ K' s# u
    , I& q+ m, E0 ~$ p8 |( E
    & D; ^3 z+ Q8 |% R4 q8 k: s; j4 g
    " m0 ]& e' }% R+ i2 ?0 n$ K
    $ c2 J8 o& P! S4 l% {2 M8 ]
    $ l7 w, J: D# s- x" }. Q
    以下参考: Python可视化|matplotlib10-绘制散点图scatter! C8 V4 R  ^  K+ f* d

    0 f) y* T! D5 {, T" Z' j

    8 `! }, f+ \  Q, V9 Y( O/ d) {import matplotlib.pyplot as plt
    % ~6 `" v8 s3 F- _$ fimport numpy as np
    9 ]4 Q; h9 ]) J; Oimport pandas as pd/ |" m+ ?, @- Q. O* Y
    from pandas import Series, DataFrame7 R& q! C5 n$ H: P% Q: l
    #数据准备
    # f; ]* Z! `7 }# y( x# E! ofrom sklearn import datasets
    $ Y1 ]3 V7 `0 W  R7 n/ a / `% U# L9 `" }
    iris = datasets.load_iris()3 {5 q6 Q4 M2 C
    x, y = iris.data, iris.target3 G7 k8 O5 a) j" X
    pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),* U, _# o# H6 ?7 T
                           columns=[
    ; Q3 [; i) O, ]% Q                           'sepal length(cm)', 'sepal width(cm)',
    : i' n! X8 P, [6 K8 a                           'petal length(cm)', 'petal width(cm)', 'class'1 @# G5 w5 H: Z
                           ])
    ' p: H; D: M# P( O. Z& l6 U0 rwith plt.xkcd():
    ) ~9 x# K6 U3 c" l; ?, @) @" F+ b " I, u6 S6 ~8 h$ P4 L" n
        plt.figure(dpi=150)  #设置图的分辨率
    : ~7 f. N# e! N8 D2 Z0 e6 g    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图9 |4 N& z: T8 ]/ j% T& |/ Y
        iris_type = pd_iris['class'].unique()  #根据class列将点分为三类* j7 s0 z9 q7 \# `  s  M2 f3 `
        iris_name = iris.target_names  #获取每一类的名称: y  {* f& k, P- n8 i
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色* K* W# I: g* o3 h
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形
      y7 S( ?* e- u7 h+ z8 ]! Z6 H   l# l: A) T5 A" Y' ?
        for i in range(len(iris_type)):  L3 J9 H4 }* U: @
            plt.scatter(
    + t4 W2 l$ K( e9 M  z7 ]. P            pd_iris.loc[pd_iris['class'] == iris_type,
    : z6 l5 A2 A$ [0 A  r8 B                        'sepal length(cm)'],  #传入数据x
    % A! j0 p  ^% l' P" y- r) |            pd_iris.loc[pd_iris['class'] == iris_type,' Q1 A' ?: j0 i9 A* [
                            'sepal width(cm)'],  #传入数据y
    1 s$ T; N' z+ [/ M  v) O/ m% }: ?            s=50,  #散点图形(marker)的大小3 Z( ]% ?6 |' H) G3 e4 y2 T, \
                c=colors,  #marker颜色
    $ i2 f7 y* q. _' b: K% V            marker=markers,  #marker形状2 b8 C1 G' x! K6 r- s  r
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充6 h  L. L$ y4 p9 L# P8 n! W
                alpha=0.8,  #marker透明度,范围为0-1/ [7 U3 ~- B2 B# L8 @- M% ?
                facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c( ]! ?, |+ U' N9 Z
                edgecolors='none',  #marker的边缘线色8 T5 ?* R* L  F% {
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    7 W- I. B" m! B# r1 b            label=iris_name)  #后面图例的名称取自label, J3 U, V% b% V' x/ w

    ; }: ?+ K, F2 Z    plt.legend(loc='upper right')
    8 |8 |2 _; \! o% Q+ H) D+ x1 o+ b, @0 H" C( f
    1 p2 m, c9 G4 d6 i; }% \4 M
    ————————————————2 r: S! X9 C( q( h$ m. y5 d
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 R* X1 A9 I/ t8 W; J" _- }
    原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753% Q5 P" j3 E3 j& u% {

    0 K  A8 s( K/ |
    ; Y# ?$ x: O9 M5 I: h, a0 N
    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-18 04:51 , Processed in 0.407427 second(s), 50 queries .

    回顶部