QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6227|回复: 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
    $ B/ z, _8 C: ~3 w  y
    一行Python代码有多强,可让图形秒变「手绘风」
    ! q2 k; l' `7 I! R0 P! _之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    8 ~+ s  X- w% S: E' V" ^  ^1 Q7 t% c& j' z7 p1 B3 ?

    2 E. [% G/ V* b2 n+ F8 Z4 X8 [但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    * f) Q$ e' h2 m  d2 y7 M7 f  o
    0 w4 d2 k% c8 N: B5 Y, X  n
    * u- M( A0 l2 w) A6 O! O) t) k
    matplotlib.pyplot.xkcd()简介, o% W$ T% m  C8 q
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
    3 g  g" a. G5 E. L( U5 {0 D# L: C0 b% ?1 b, K* ^
    % F: l) Q- c5 T* [) K' X7 A
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度3 C! |3 n3 |1 k# d: P, t  D
                           length=100, #褶皱长度" s  q( f) y# E2 @
                           randomness=2#褶皱的随机性: }% ?( g# G) Z. U3 l
                          )
    % e. \& P+ J1 @! {" F5 umatplotlib.pyplot.xkcd()使用& D- ]1 s( g/ x/ j4 `/ Z8 |
    如下,加with行代码即可,括号中参数按个人喜好决定是否设置~8 l: u; y- j& B3 d
    1 K/ ^6 c2 Q0 D7 r) n

    ! |8 j# M  p/ m* _( R8 \& j1 Jwith plt.xkcd(scale=1, length=100, randomness=2):5 I1 p! q# n2 ?- U1 w( w0 ?, [
    #with是临时使用一下,不影响其它图使用正常样式
    , M$ b2 u) ~* \* ?/ W2 U3 K/ s" b6 }    绘图代码
    5 g- h. B9 \5 V6 J7 ^" f( {3 Z    。。。。。。- `; m& c' D: t) B( v: Z
        plt.show()$ G. U2 A2 @/ j" M1 c2 Z: i8 m$ J
    matplotlib.pyplot.xkcd()使用实例 2 g$ _1 r! @5 H- k3 O) `7 Y
    下面代码为pythonic生物人公众号之前的文章代码
      q! }& k" ~% p  |' V. z9 N. D8 E- q
    6 r  n$ @$ ]+ V# ]/ v- ~* U
    以下参考:Python可视化25|seaborn绘制矩阵图# t' w- E1 N( G$ u5 x

    ' _& ?+ e% p8 Z* f8 b+ l  a( @

    & r, Z, l9 n. S1 a#支持seaborn
    : y( C' G" }0 G. |import seaborn as sns; }! y4 ?7 A( Q+ \
    iris_sns = sns.load_dataset("iris"): o. ?' i1 w2 y! o9 [
    with plt.xkcd():3 Y0 @9 I6 B/ p0 q4 L% d
        g = sns.pairplot(
    : ?. z1 V; x0 w: y/ t7 E        iris_sns,
    ! w$ l" B$ L6 U        hue='species',  #按照三种花分类
    # A6 [8 b2 u3 B% r/ g$ e) L        palette=['#dc2624', '#2b4750', '#45a0a2'])- c0 d  v9 X9 r# g) z5 h( B* [: z
        sns.set(style='whitegrid')
    . [. O5 F% s# [% R; P    g.fig.set_size_inches(12, 12)
    9 [- I) s1 S* s: C+ K" E    sns.set(style='whitegrid', font_scale=1.5)
    2 ^2 S/ I5 A1 n7 e  + p1 }0 L8 S3 f: x0 y4 N
    ! I6 S: L; V% L5 `) B5 f
    : Y8 {; Y# a4 z9 q* n
    以下参考:Python可视化29|matplotlib-饼图(pie) ; Z9 u0 `" R6 W1 _9 B0 T

    # e* T9 v3 d, q

    ) s# {6 V& D& @% h$ }import matplotlib.pyplot as plt: q- ^* Y( a+ S
    with plt.xkcd(9 e. {) ?2 a' Z( k" G
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度
      n3 J* X7 `3 W* G9 @  T        length=120,  #褶皱长度+ \$ |* A9 O' e4 J7 H. P1 N; D' _
            randomness=2):  #褶皱的随机性
    8 }$ k( d5 P/ N5 T$ F# t    plt.figure(dpi=150): ]' N) p5 g. v, o
        patches, texts, autotexts = plt.pie(* T0 l; v8 `7 `5 f4 {
            x=[1, 2, 3],  #返回三个对象6 j1 M. k3 b2 v; |( O$ `8 g
            labels=['A', 'B', 'C'],
    9 P& w# a# @% x, K5 B) u& z4 N) u        colors=['#dc2624', '#2b4750', '#45a0a2'],# q: g* W' e4 Q1 E) L
            autopct='%.2f%%',( S7 R, k0 u& l5 \6 A
            explode=(0.1, 0, 0))
    9 N& ~  [3 A, `    texts[1].set_size('20')  #修改B的大小
    % A* w* i/ \5 Z; n1 y/ a" y( j
    0 G. o; X5 W1 l: P    #matplotlib.patches.Wedge
    . L4 x# z+ }* P) [/ `% W    patches[0].set_alpha(0.3)  #A组分设置透明度( D* N; u# }0 x% z0 N8 k
        patches[2].set_hatch('|')  #C组分添加网格线
    ( _) P9 R' I# z. R6 g9 l( d7 ^    patches[1].set_hatch('x')
    ; k% F+ X3 M. c- E; @8 {9 k4 v3 ` % k* e" A" F2 S: T% v# @
        plt.legend(
    7 N* `+ x( k& z# h  `        patches,
    / e9 ~( E" e7 o" ~0 Q0 c# @        ['A', 'B', 'C'],  #添加图例! w' t) c' g  Z- f1 C
            title="Pie Learning",
    & x$ h; H6 _; F  H        loc="center left",$ f) O' N0 l. Q* }, B6 |
            fontsize=15,
    , ?* s" l/ o* }' ~3 V, ]        bbox_to_anchor=(1, 0, 0.5, 1))
    & t" \# N$ e. h4 w% Y 5 l* W- L) K( r5 B1 b/ W4 d
        plt.title('Lovely pie', size=20)
    5 y1 E3 a. S- e8 S3 h  P    plt.show(). R3 k! \& z& R

    , W4 d: F; p5 P; c, l

    # |. v% e+ G& `0 w
    & y" j% D4 `* E: H
    9 i+ t! @+ W, Z3 {! q4 o' k
    with plt.xkcd():
    # h- |3 b% v' C5 V- q    from string import ascii_letters. g' O1 f3 u( q! z
        plt.figure(dpi=150)
    % ~. u3 x7 Q/ b! m2 {! ?    patches, texts, autotexts = plt.pie(
    ) d0 a0 A& i5 k; B! ~) f        x=range(1, 12),
    5 g, U: z" G5 p        labels=list(ascii_letters[26:])[0:11],8 v) P% H$ {! M, d" Z) H
            colors=[
    ' V- I4 ~. J/ m( L( r0 T: j' e% s            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
    : F) Q* [# O# }5 L. Q, c            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    8 C3 ~- T1 j% O! c        ],
    4 E9 G3 n( r7 c* i( T; E        autopct='%.2f%%',
    : i' B  k! k& X- Q: b, J    )
    ; @7 h7 j& Q0 E0 d* j5 D# c    plt.legend(
    / y* C+ i. E- ?5 ]; |- _        patches,7 i, O. S$ W/ B. r/ ~; f
            list(ascii_letters[26:])[0:11],  #添加图例" \9 f; `! U: [- z9 ?6 t, e
            title="Pie Learning",  \2 b1 u1 U; Y& ^' I# K3 Y/ z) E
            loc="center left",
    ! o# ?: k' ]* j        bbox_to_anchor=(1, 0, 0.5, 1),
    % n; Q/ i) S9 e' J- Q" ~8 M& H        ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    + b& C& P6 Q# g1 k3 s    )0 Z7 t- O3 i% ^( _
    : q  B' g# g" h! ]$ D  a6 X' t
    + B; s9 T/ h6 D* Y% O

    * h, B' a% T- W+ _

    $ ^+ [0 V- b1 g; ?import matplotlib.pyplot as plt
    5 Q7 N5 \" W# H% ?( w! i; ~& oimport numpy as np& v' \# D% `. }0 s0 Y" W0 `
    with plt.xkcd():
    , Z5 _; Z* j3 K# U    plt.figure(dpi=150)& u* v! B& R9 ?3 Z: c
        labels = ['Jack', 'Rose', 'Jimmy']' F4 u- |' G0 e, o$ m
        year_2019 = np.arange(1, 4)
    1 ^) g2 D& O8 K! x9 D8 G" Y* d    year_2020 = np.arange(1, 4) + 1
    $ f6 w# |3 n, Y. A; x7 ?3 b  K    bar_width = 0.4+ q* S2 U+ L; j: D
    / d! O. p9 e: a' `  `8 a  R; I6 Q
        plt.bar(  e  p' [, H( K
            np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    ( ~( c" x2 B9 V, p$ O1 f# U        year_2019,; ]$ R  U, `$ S* o& e
            color='#dc2624',  c  f6 D9 R2 @4 w# l
            width=bar_width,
    ) J$ t; ?2 `: }( _4 d- Y$ G+ X        label='year_2019'  #图例
    , m6 ]; l; E) ]  O$ [5 g* j    )
    ' h! P4 }. \- m1 r9 M' r& l3 L    plt.bar(. A% e9 u' T  v& e
            np.arange(len(labels)) + bar_width / 2,5 k/ k! |, P* a* y! Y) ~. H
            year_2020,
    ! L/ d$ j. P- m4 _5 T( u+ x# {        color='#45a0a2',7 j' U1 |4 l* X: ^
            width=bar_width,/ p. Z3 b0 Y/ p$ c+ z; ^- W) @
            label='year_2020'  #图例; h# {/ ]: O& Z1 b( M7 J
        )
    ! F. H1 I* L7 ~9 R2 g/ O1 `    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称
    1 e' s- [8 X3 o: \! i# P    plt.legend(loc=2)  #图例在左边3 T# ~* @. {3 Q* F
    以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
    3 S; A& z- D* C9 [" n
    " F2 v0 W2 \7 t9 T8 D

    ( J3 |( ~+ z( {7 e, d; i; I+ ?% B2 |+ p; K' a/ `: B  g

      K- @0 q! b: q0 ^
      s! ]5 j2 G$ Y$ }, z& k0 }* d

    7 ^/ G9 f# b5 E以下参考: Python可视化|matplotlib10-绘制散点图scatter0 }+ H" I7 g. [+ W" i& M6 m" x

    ( y& z2 f9 }; w5 m7 t% r) Q4 i

    9 J& B, l; _1 v2 P2 Wimport matplotlib.pyplot as plt
    3 o! m. A6 `7 t3 q% Nimport numpy as np" @& @9 v0 o4 A9 J
    import pandas as pd" z* M/ }, U) |& Y2 P# A4 n* j
    from pandas import Series, DataFrame  C, y4 g- d7 i0 L
    #数据准备/ s: {% [; A& T& [6 L
    from sklearn import datasets
    - j6 e; w6 p6 S, F! m
    0 m( I# Y2 I0 k- V. c) _iris = datasets.load_iris()
    4 C) N+ n6 F9 [6 g$ V8 X1 ux, y = iris.data, iris.target
    " o$ O" m/ O" Ppd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
      @7 r2 H% o' z( e                       columns=[: \% Y0 Z' j- \! \9 y1 C0 Y  O
                               'sepal length(cm)', 'sepal width(cm)',
    & q- q1 h# R" [( ^- G1 b                           'petal length(cm)', 'petal width(cm)', 'class'
    ! d4 {; U. ]; \/ }, g                       ])# B! k$ z4 L$ K' M1 q6 I
    with plt.xkcd():
    5 C5 P+ R9 _, P# u( G; c7 J
    / O/ V+ g. J) Y( J    plt.figure(dpi=150)  #设置图的分辨率
    7 G  J6 e/ n" k1 z    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    8 O+ |6 |% q0 C. t3 a# ?! s- t    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类( y4 ~! j/ @( h4 `+ W
        iris_name = iris.target_names  #获取每一类的名称
      D6 X$ ~1 E6 |1 J- H. q9 S    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色+ q8 G& r7 n# D8 o  @8 |/ e! i1 G- b
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形" E" }2 A$ V. b

    * P" b1 v" T6 @7 j    for i in range(len(iris_type)):
    ! a; `- W6 J9 v) G9 X. O0 b3 C        plt.scatter(
    & g4 J1 \3 G7 J8 K            pd_iris.loc[pd_iris['class'] == iris_type,
    4 b! z% o' r+ N9 P7 R# I! H                        'sepal length(cm)'],  #传入数据x
    / ?) W1 o, C/ d& z% _            pd_iris.loc[pd_iris['class'] == iris_type,
    # }# K4 x& E" d: I                        'sepal width(cm)'],  #传入数据y
    3 s! m0 e1 }( h8 R8 s3 @0 s            s=50,  #散点图形(marker)的大小- J/ }- T" E7 W+ [( c7 S
                c=colors,  #marker颜色
    2 A  ]/ a% s, g9 {            marker=markers,  #marker形状$ ^& X* d4 H9 {. s  Z9 Q
                #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    4 K1 A( k; O! z( |/ j6 s4 b            alpha=0.8,  #marker透明度,范围为0-1! ]1 \5 O2 s; H7 @- Y' w& g
                facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
    6 F( S9 W/ K9 ?            edgecolors='none',  #marker的边缘线色2 T& F" P& {& O; O/ k# F
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用( k+ x' f* f8 D& p
                label=iris_name)  #后面图例的名称取自label
    & L6 p  t- Z' K" ~, K
    1 X4 ^2 E+ m# e    plt.legend(loc='upper right')
    # K8 ^3 j! v0 L  q, g5 t7 n4 E  n; [2 \
    4 G+ B8 }! ^5 L" |
    ————————————————& a' [* Q3 N9 F) j- D* ]8 ~  \3 J
    版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ r! e! t$ K- j- h) M. \6 ^
    原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
    ) M( I0 E9 V4 w& R3 `- s( O) j/ r  z& m$ d0 r* h( x
    , o" F" M! b  y& C
    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-21 17:57 , Processed in 0.392061 second(s), 51 queries .

    回顶部