QQ登录

只需要一步,快速开始

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

    & ~5 t9 L7 e6 r8 W2 ?) E1 O一行Python代码有多强,可让图形秒变「手绘风」
    - I% x) V- u- s+ j" o( ?( ]6 l之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    7 }: w, t1 F. U( |' ~. w) l5 ?
    ( k6 n# T5 ]/ p4 a1 R2 g* S+ {
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    ( [) g- d/ c/ a, q( L) q
    : [" q0 D. t1 w% c+ G' k2 L
    9 \4 d2 H! \% d+ V
    matplotlib.pyplot.xkcd()简介
    & c9 |& |  R* X2 J5 U7 Y! E这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小# `% x0 M& q6 q, W. @
    / Z! F) b* [( i4 I, \9 u8 s
    ! M, Y/ T, r6 L
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
    ! i4 a, a8 c: [) f8 [& j$ j, W                       length=100, #褶皱长度( Q# E1 c& R! S- k8 @
                           randomness=2#褶皱的随机性# ?; A9 W: ~: d
                          )
    $ h- L& n$ G+ v& b5 X/ `% x' z: s8 hmatplotlib.pyplot.xkcd()使用* T: r! |& e9 ~! w! I. L. Q! y
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~6 x' S7 z8 ^+ u; c8 v( _" a

    $ ~5 L1 D1 q$ W+ j$ {4 |3 m2 {) g

    0 W# Q/ \0 N& o& iwith plt.xkcd(scale=1, length=100, randomness=2):6 e; y" W  [) M/ h% y6 L
    #with是临时使用一下,不影响其它图使用正常样式
    ( R/ |& O) \) |5 L0 W    绘图代码
      J% d- G# F" g; n    。。。。。。# q/ @7 Z. B8 d( G1 V" F3 h
        plt.show()4 R$ M, {! T8 j/ A4 a
    matplotlib.pyplot.xkcd()使用实例 / R# k: |- t7 o: k% ^
    下面代码为pythonic生物人公众号之前的文章代码+ ]$ l+ }; i4 L  L) b2 f* R7 l, N

    ; F3 I8 }' L7 D
    9 j. P4 q  w3 f# I; r9 g5 b
    以下参考:Python可视化25|seaborn绘制矩阵图
    4 T) i4 b7 j3 L7 s& M. {) ^/ W
    # t3 h0 U  k+ h' `7 c) U) V- a

    # ~" S1 A, B! {' i#支持seaborn& r2 A+ e2 g& B
    import seaborn as sns
    ! o# z8 H( o. j3 y8 C1 Xiris_sns = sns.load_dataset("iris")
    + E8 P1 U5 ]/ P; M- ?with plt.xkcd():
    - \8 {9 ?$ J* j' x9 p" C5 y5 q( \    g = sns.pairplot(: l& _0 A6 g1 Z7 t# D" [
            iris_sns,2 k6 s  Z$ }* W! w# l6 \
            hue='species',  #按照三种花分类
    ' d5 [2 Z* _5 i2 F7 Q/ o6 Z# c        palette=['#dc2624', '#2b4750', '#45a0a2'])
    - q4 C" z. s7 r' Z* k/ |    sns.set(style='whitegrid')* m$ r. j. H! Y: n- g! \
        g.fig.set_size_inches(12, 12)
    + D& B: q- `0 Y" v' [    sns.set(style='whitegrid', font_scale=1.5)
    * B, S# l7 U3 z* [6 B% U2 {  7 \, r( n/ s3 k" w) y
    $ `% x2 s' p8 i: e

    " l3 y9 K1 Q' q0 I- p以下参考:Python可视化29|matplotlib-饼图(pie)
    ) R, u' @8 g- z" V
    0 Y4 i& h% L! X! z
    + i' u( u2 I/ ~8 A1 h  E: W
    import matplotlib.pyplot as plt5 b( J+ O/ g  ]( M4 i
    with plt.xkcd() j6 S7 W  G. ?. u
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度
    , ?: S* Q. U/ E& p        length=120,  #褶皱长度
    4 K" ]% q+ n0 y7 k0 F1 {. n        randomness=2):  #褶皱的随机性
    : U* _# w+ W# g( |8 H    plt.figure(dpi=150)' N/ M4 w* v. n8 N+ k
        patches, texts, autotexts = plt.pie(
    5 J9 `" b+ ]- P- i7 L, E        x=[1, 2, 3],  #返回三个对象
    , o0 T; f$ X/ _' W# u6 }        labels=['A', 'B', 'C'],
    8 S. A. o( K  M) I6 R. e) Z        colors=['#dc2624', '#2b4750', '#45a0a2']," b: C) A% S2 j& H+ a$ S; A
            autopct='%.2f%%',
    7 n! Y: A3 g' U2 k% @        explode=(0.1, 0, 0))
    / i% A  E* g+ {5 ?' U. l    texts[1].set_size('20')  #修改B的大小* L$ G" [/ H/ x! X

    # [& K) S6 K" n/ Y% y1 m, I9 f* t# m    #matplotlib.patches.Wedge
    ( W! d4 S" f2 L  b    patches[0].set_alpha(0.3)  #A组分设置透明度0 [& H2 z, z9 h, g& r
        patches[2].set_hatch('|')  #C组分添加网格线
    4 [$ r% y( N+ v) W    patches[1].set_hatch('x')$ c5 N; U  y3 i& w
    4 N, M) |- I- r* z+ c% y3 g. \# Y
        plt.legend(% W! j& o* @8 w3 y) _& L
            patches,8 P5 ^( B3 s4 e5 r" V) f7 _% ^, f
            ['A', 'B', 'C'],  #添加图例2 l5 P( j* e: j/ w( y. M
            title="Pie Learning",
    + f/ `1 q/ f3 s$ Y* m        loc="center left",
    2 ^! f3 ^  F& c3 I1 T! M        fontsize=15,
    - k! C, i4 R7 O8 I/ |        bbox_to_anchor=(1, 0, 0.5, 1))7 K$ v+ c" X8 \. d7 B4 B
    ; Q/ e2 q& Y& Z# k% Q# m" K
        plt.title('Lovely pie', size=20)
    # q5 \2 o% n. e1 h8 v    plt.show()3 \+ L2 q; C0 T

    0 _6 }, e) w4 r
      G8 |3 W7 L0 I" @3 \4 a1 P, ~

    & Q) N) U4 S) o" _
    3 n9 W6 r( F% O7 Z9 l7 j2 i* M/ h2 m
    with plt.xkcd():" _+ H1 `1 J8 Q' j7 a
        from string import ascii_letters  K6 V! D# p) o2 ]7 N: E+ K& E
        plt.figure(dpi=150)- X* G- ?5 ^+ ^7 M+ H8 ~3 }, J
        patches, texts, autotexts = plt.pie(6 k. c# S, A: ^% D
            x=range(1, 12),; b7 P0 d# j- L8 N; J3 @
            labels=list(ascii_letters[26:])[0:11],
    1 s" Q" x6 E" {7 O2 ?        colors=[+ l4 z$ u. H  y1 g1 ^5 I) @
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',9 n  b% O" h) {% J+ }& p
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
      ?3 M6 f3 |  s! u" o$ E        ],
    2 O' ^  i" h: p4 E- [1 _        autopct='%.2f%%',
    - e1 B! ^! p: @9 r" h8 V' H    )
    4 @+ Z/ W- [  E$ ^( p    plt.legend(
    " l2 k+ k; z" _8 b7 Y( Z        patches,; Q& ^$ i3 g# S. Q* P0 |
            list(ascii_letters[26:])[0:11],  #添加图例
    1 }' P. A3 [5 Q9 F        title="Pie Learning",! Q" U  o  M5 u% D
            loc="center left",
    , f1 m/ L, x: w8 @        bbox_to_anchor=(1, 0, 0.5, 1),
    3 G0 ~' q$ g2 e' b/ |" @. w        ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    1 I  w$ {7 }/ y6 p" X8 f) R7 @! Q    )# r) [4 K- \/ N/ m: R, J" O- g0 b- [

    + D, {+ X& L& H7 p: G* m

    * B; J+ ~3 Q* u
    8 a* t1 M( J9 s0 v! ]" x

    ( G* B; e7 X8 w! c# e! fimport matplotlib.pyplot as plt7 w& t4 W  p- {2 A
    import numpy as np
    8 I! f  j: p/ S% _1 d. Kwith plt.xkcd():
    # g+ H; J* [, ^5 U6 P    plt.figure(dpi=150)
    5 I  i- r$ g# C+ U$ a- ^    labels = ['Jack', 'Rose', 'Jimmy']
    / V7 J  v, r& \7 h0 B. i& g2 ~; i0 T    year_2019 = np.arange(1, 4)
    - k" `; y2 J9 C- a    year_2020 = np.arange(1, 4) + 1# u$ q! z8 [3 r# v' H
        bar_width = 0.4
    - l6 k+ j- k' ^! a$ q0 Y . i- y9 `+ v( y9 n8 {
        plt.bar(
    9 N$ j" w# Z" u' G% R6 y* u        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽. H, o& H7 U% e1 e/ T2 t9 M- p
            year_2019,$ Z+ G2 ~9 S  ^" N2 d  i* n
            color='#dc2624',( i' K& e0 i, M1 q" f4 l
            width=bar_width,
    , I, w2 H' v' {3 a        label='year_2019'  #图例
    : f( v$ N  ?" [    )/ c5 l; Y& y$ S' P, R
        plt.bar(7 D, o/ g7 n+ |/ [
            np.arange(len(labels)) + bar_width / 2,
    & i* d9 Z+ ?3 z1 ~6 ~; w2 y3 X6 M1 C        year_2020,
    ; V! i. g. |: ^  K- V1 ~3 I        color='#45a0a2',$ l, Z. O4 {: P; ~+ w
            width=bar_width,
    ) Q; K8 e6 ~$ S* P. E& D        label='year_2020'  #图例
    + Y# i" f  O7 ^8 k0 N  {    )" z8 u% H- I6 n, s) N- c
        plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称  ~( l4 G1 _$ `6 ~6 M8 t; i1 Y
        plt.legend(loc=2)  #图例在左边1 S/ O3 t0 M- ]( W2 ?# b
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
    - M- O# J9 B. c$ E: c- A! W
    3 ^- Q* u( F5 |# p
    # r3 H7 `) D; }8 ]7 W
    ( U/ u- M+ w$ j* \
    9 Y1 n$ |$ V% m& F# P
    ; Q! @( }/ @3 |$ ]% Y0 z0 T, g
    & ~+ d3 v& P$ m7 D# b1 D
    以下参考: Python可视化|matplotlib10-绘制散点图scatter& k2 J" Y3 o# R5 q8 `
    7 o! b% y& W( h, l$ e  F& D
      A) N' }5 ]- _+ ?
    import matplotlib.pyplot as plt
    3 b4 ^8 p, z) j+ a3 ?import numpy as np  q2 i% t7 X( O& h8 ]) Z+ |
    import pandas as pd4 \/ {7 a8 Q0 B4 M
    from pandas import Series, DataFrame: }2 |8 q# R7 X  b$ `
    #数据准备+ x0 m' E5 k( @+ ^* ]3 b9 O9 S
    from sklearn import datasets' Z4 U1 z$ Y0 B9 Y
    0 {3 A, s: g+ s. g
    iris = datasets.load_iris()
    , b" D2 K; i/ `$ s# s2 C( u8 Ax, y = iris.data, iris.target
    $ `& X% A' a# b; Tpd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
    ( r1 Y- T5 N" }1 `  F+ M" b                       columns=[
    $ N4 {5 W  p7 G                           'sepal length(cm)', 'sepal width(cm)',
    / ^' A8 K, T0 g+ O& z5 q                           'petal length(cm)', 'petal width(cm)', 'class'+ X: y+ v) w" s6 D
                           ])* G: e8 W6 u7 ^5 a. A, H
    with plt.xkcd():: e* B2 u+ I7 u# ^0 m$ E2 Y

    / E6 _% N6 _+ R4 ?0 M    plt.figure(dpi=150)  #设置图的分辨率
    0 L* ?5 L6 d: v  [9 J2 W% s    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    9 v5 C$ d. C5 S8 g+ u* l    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
    & ~3 O1 {8 i( B" \    iris_name = iris.target_names  #获取每一类的名称) b5 P( E( S9 J' r4 A" h
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色' S( Y3 y4 i! w9 S
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形2 v  ~( I) _! W* }/ D4 f* e3 ]+ B
    ; ?# W4 J# [6 F/ `, X- C
        for i in range(len(iris_type)):
    % H9 d' Z' |% O& N        plt.scatter(
    ; U0 @5 n+ d! T% D. _            pd_iris.loc[pd_iris['class'] == iris_type,# V0 T/ _, B/ @. Y9 M9 G
                            'sepal length(cm)'],  #传入数据x; D2 `- g0 S! ^( j2 X$ \# A
                pd_iris.loc[pd_iris['class'] == iris_type,
    ; f$ F% Q3 g- J. p. k: \                        'sepal width(cm)'],  #传入数据y
    + Y6 v5 b7 I( z            s=50,  #散点图形(marker)的大小; \+ {/ o- c# ?/ U/ r6 y3 l' E
                c=colors,  #marker颜色
    ! D4 E( d4 W7 r4 Y            marker=markers,  #marker形状( b" W( ^  z* g8 x7 C% {! l
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    9 n- J3 D3 z3 d. O% {            alpha=0.8,  #marker透明度,范围为0-1
    % U  s! a7 D% [6 Q, `            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    + m8 s3 e; M7 B' o6 n, |2 q            edgecolors='none',  #marker的边缘线色7 i" c" b% ?! e3 T2 x4 i4 M
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    ' Y! L/ L) q1 r            label=iris_name)  #后面图例的名称取自label  Q; k) V/ `5 J. N1 |& Q

    ! p9 l* B  [* \1 h4 H, N0 U- _- y0 R" s    plt.legend(loc='upper right')$ U2 u8 h" {8 t- ^1 b  e

    9 \5 T% p* e  X( L; X
    - A: I' m6 R5 _% {' q( W
    ————————————————. V. f+ s- O1 W+ _% s  I$ ?2 K
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 v$ b. T, n5 m$ [
    原文链接:https://blog.csdn.net/qq_21478261/article/details/1189637532 x' q/ {5 c' R2 f

    5 m& E% m  K8 E: m1 n1 A
    # v7 C0 r+ u& Q
    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 22:37 , Processed in 0.425370 second(s), 51 queries .

    回顶部