QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6283|回复: 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
    7 G. p: X- o8 W& j' ?
    一行Python代码有多强,可让图形秒变「手绘风」
    ' q/ l3 |9 t  C9 q& d, q/ L之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
    4 d3 N2 r8 o9 h8 X7 M
    3 o: E# x. N! i3 o- ^4 t
    + T6 k* d$ g9 Q+ J% q
    但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。
    & Y8 d5 r. d8 v5 Z  q  w4 b. v& S3 T( [* J" B  {

    1 R& q  R5 |9 z( \* Vmatplotlib.pyplot.xkcd()简介! n  _; z4 ~  L; g$ J  h$ q' J9 S
    这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小3 v# |, n8 o) ]5 H7 e. [; v
      D# @8 `) G, H* Z/ U+ |
      v3 W2 l! J$ L  m0 h  A
    matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度2 q. Y  V9 h+ O) `! R1 Q1 M
                           length=100, #褶皱长度# z% P) E+ T; X0 M
                           randomness=2#褶皱的随机性2 }, w5 r5 v5 C; J0 r, q, p9 R' g
                          )" W6 f5 Z4 v" g/ [) H
    matplotlib.pyplot.xkcd()使用
    $ U4 s7 H2 n& q, a$ m如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
    $ d# X6 q2 D! G
    3 F+ a4 {' {; H8 X& R

    & r7 v$ ~7 s' ]+ r) n; Dwith plt.xkcd(scale=1, length=100, randomness=2):: F# i/ @  L0 I7 U. p* }% p
    #with是临时使用一下,不影响其它图使用正常样式
    3 {3 H- N8 m7 t. ?    绘图代码. N' s: ^* h8 {( t
        。。。。。。" y; c; U8 Y) J8 R8 T+ g
        plt.show()9 R  K! E$ Z$ Z/ S
    matplotlib.pyplot.xkcd()使用实例 2 c* p. M1 t: ~# y. q" V! m% H% _! `
    下面代码为pythonic生物人公众号之前的文章代码* Z, }* U% q  @8 M. W

    2 I  j  O: ^# e
    8 H3 p% V4 f8 u% u& v
    以下参考:Python可视化25|seaborn绘制矩阵图5 R7 l9 N+ X$ E5 G' u1 h$ g
    & g2 T: Y, }3 O# k4 g; T% z
    . d) U5 J; @8 ^$ \2 `) C+ A
    #支持seaborn
    . _, _. h/ M2 M$ x* U! U/ Pimport seaborn as sns
      J' e. Z, M2 r! B9 Yiris_sns = sns.load_dataset("iris")2 ^' K& k! a4 o/ A$ q8 R& S
    with plt.xkcd():
    # l3 [2 r& o6 u& b  g    g = sns.pairplot(
    % P4 B. U: P' U  p0 U3 A5 r        iris_sns,( t! h/ a9 Q/ j# p% U# [3 }- B; C5 @2 F
            hue='species',  #按照三种花分类
    9 f- d3 C, d' ]. L        palette=['#dc2624', '#2b4750', '#45a0a2'])
    4 \; I) H& b3 x. O5 c8 {    sns.set(style='whitegrid')
    0 Z/ d+ f- q' E- q    g.fig.set_size_inches(12, 12)# l- H  F+ Q( b: a& w
        sns.set(style='whitegrid', font_scale=1.5)' i  `: Z0 ~. T- D! m- ^6 |
      
    ! V7 h) j$ z8 R" [$ T/ U* I* p! k* n- j' q

    & e! m' r3 ^# V7 W以下参考:Python可视化29|matplotlib-饼图(pie) * x5 n; U) |; Z3 T, v* j1 V
    : s& u* h; V, R! x) _$ `
    - x. G  {+ T1 Y( |1 n6 x) A
    import matplotlib.pyplot as plt. c5 ^; d8 ?3 I
    with plt.xkcd(2 g( i" Y5 v2 a' _2 Q
            scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度% Z7 m, m* r- J
            length=120,  #褶皱长度  j( w- S5 {0 r, X* L% H9 ?( X9 X5 A
            randomness=2):  #褶皱的随机性
    5 `) K' s& K8 p# e' q    plt.figure(dpi=150)
    ' \, ~- G$ Y& z    patches, texts, autotexts = plt.pie(
    4 }1 P8 X+ L4 T        x=[1, 2, 3],  #返回三个对象% {/ Q: y2 l) E8 v$ [
            labels=['A', 'B', 'C'],, h- o& K) Y; B# {
            colors=['#dc2624', '#2b4750', '#45a0a2'],
    + `9 m* q" o% e3 }% ]8 u) [        autopct='%.2f%%',1 K) e8 ~4 _  h. S
            explode=(0.1, 0, 0))
    / K$ H2 R2 {! B) u' v    texts[1].set_size('20')  #修改B的大小) `; \5 z0 z/ n, l1 G
    0 x" t% Z; \2 @* s$ r
        #matplotlib.patches.Wedge# I) R( a0 u0 Z4 V
        patches[0].set_alpha(0.3)  #A组分设置透明度. u- Z) o: F5 n/ c) z
        patches[2].set_hatch('|')  #C组分添加网格线
    7 A, y  g& b' s    patches[1].set_hatch('x')% W0 j& x; R* Y* a4 q: V; n1 o, E
    . M3 \; \6 ^, J' U: T. ?5 c
        plt.legend(
    ) j" z; B8 {) T- Q; ^        patches,
    1 F) L; v8 H/ L8 U1 R- \5 t        ['A', 'B', 'C'],  #添加图例, V# i8 D, g7 s
            title="Pie Learning",
    ( }' E$ F% d/ C/ z; u' y) |7 O6 a        loc="center left",0 p5 e: ~& _: j& D/ C# b
            fontsize=15,0 E& L9 Q5 K2 c+ m" D! d
            bbox_to_anchor=(1, 0, 0.5, 1))7 P# `" ^4 Q5 `( |- }
    4 e1 a! a- g) W, ^5 \# s
        plt.title('Lovely pie', size=20)
    6 b3 u) B4 b* _    plt.show()% E" T) r9 y( u7 p/ o5 y6 j; t- [

    " O. ^, m6 e2 C) Z1 H
    " D/ {4 P0 T, U6 z$ A

    / m5 l! W0 F5 i, _7 @! G. w% g6 k
    0 T/ z% {' S+ G0 ~& H/ Z4 u1 s
    with plt.xkcd():" e% N1 A" `  r) V; ?
        from string import ascii_letters
      v5 S9 I) ~2 c( F- l8 \. t    plt.figure(dpi=150)0 E; ]4 \4 s5 W% y" R0 F9 E! g2 b0 b
        patches, texts, autotexts = plt.pie(
    7 O# b: C7 {- ^: F        x=range(1, 12),
    3 T5 A2 M. |6 T) @" y# m        labels=list(ascii_letters[26:])[0:11],$ @6 [$ t1 L6 a
            colors=[+ L. H% e( `+ X5 {8 j! ]& Z
                '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',% w& U6 _+ y7 x' J5 A. ~
                '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
    / ]' j, J3 a, T7 D5 ]        ],/ @) ?$ q. T( O5 Q* ^5 @7 b& t
            autopct='%.2f%%',
    ( Z9 ^0 v+ ~; t    )0 t5 d% v0 G3 ^
        plt.legend(
    0 f" X6 D! w2 B- z( T9 a        patches,; [$ }; i; ]( v9 F, [
            list(ascii_letters[26:])[0:11],  #添加图例' L/ \9 A8 V9 c) }5 K
            title="Pie Learning",
    ! t- S/ o8 g% {  n- d        loc="center left",
    + @; S2 u1 d5 {        bbox_to_anchor=(1, 0, 0.5, 1),
    ( Q- j& w# X% T        ncol=2,  #控制图例中按照两列显示,默认为一列显示,
    # d- R+ T, U& v/ k    )
    ' G1 }7 x5 r3 {0 J" n) B( h6 k8 u9 u6 t. q4 r3 K
    7 n, A$ [9 K( p% m4 N+ z8 p0 H2 ?$ K
    " @& Z1 F- k: x# G1 k

      r. V: ?6 `+ e, U+ |8 X- g5 }3 ximport matplotlib.pyplot as plt
    ! K; V- W6 R' K- D5 L. {, L1 Nimport numpy as np
    . Y& V% O5 o& @, r0 U+ Q# vwith plt.xkcd():4 u& }' I! t2 c$ V& V3 g
        plt.figure(dpi=150)2 p+ H. T! f: i6 d6 T; ?0 Y% X8 @
        labels = ['Jack', 'Rose', 'Jimmy']
    4 B! i0 z& \1 [6 `1 J+ O2 o2 \4 `    year_2019 = np.arange(1, 4)
    3 N: j0 M7 y8 |9 N8 t. w    year_2020 = np.arange(1, 4) + 14 ?* Z4 u! S# ]$ r
        bar_width = 0.4
    0 G# Q: A4 z* l5 |+ V" F. h , v3 H. x# A+ K* q' [" t
        plt.bar(
    ! s8 s8 e4 ~/ `. d( i) ~0 ]        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
    4 M7 E! R% {; @4 V+ y# M, r        year_2019,, y5 q4 O1 G* z4 }
            color='#dc2624',
    * |" H9 i% ?$ f  O        width=bar_width,
    0 A2 |: S1 Y7 P3 q, \        label='year_2019'  #图例% z$ P+ a, u4 |9 T" ^
        )
    / C: l3 W" {7 O/ G" J    plt.bar(
    3 w5 T$ O6 o1 W        np.arange(len(labels)) + bar_width / 2,
    + _' c* b) n) m& U8 M        year_2020,
    4 f/ u( M/ T$ d, S$ Z  h# u        color='#45a0a2',
    3 l/ o' d5 k1 G        width=bar_width,' ?+ u2 ]$ c4 l( Y6 c: V
            label='year_2020'  #图例
    6 n3 G  |) w2 Z0 b: h    )
    % o) e- z. T6 Y9 ?. m. t& ^3 L    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称3 d9 W7 g2 Z- q+ q
        plt.legend(loc=2)  #图例在左边
    8 J6 K, x: [2 c7 p7 X* \- L* U/ X以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
    % r6 o$ `/ l4 E, Q( ]/ R( B0 D0 f& @" I, {7 ]* v6 }
    1 a1 k1 ?1 K! J7 X8 S* K4 c0 _
    7 F5 |5 v1 ?) i) Y
    ; w0 K, \4 a6 n# Q

    ; {! N9 H$ J  t, ^& Y' c
    9 C9 {& P* i) A5 s. J4 A! X
    以下参考: Python可视化|matplotlib10-绘制散点图scatter
    * f) r' y9 w# G. Q- a+ g' e: o0 y5 w9 W. ^8 X$ `8 I, z5 T5 S9 B' R

    . p3 x1 `  ^! E7 V- V1 L% r! Himport matplotlib.pyplot as plt2 v" f: @2 U, |7 q# B, A
    import numpy as np* e2 S% f" G1 {3 o: L" H# d
    import pandas as pd( t& x! `- a6 Q% u9 }
    from pandas import Series, DataFrame
    1 a5 C: T$ F6 ?% i#数据准备/ `# N# Y. i2 s% a# x
    from sklearn import datasets6 n" U* L$ v7 Z, k" d

    # R$ N$ @& ?  }0 J! ]0 }  L5 J( riris = datasets.load_iris()+ [0 @' ?, h8 r+ M% V
    x, y = iris.data, iris.target
    - a/ E9 l" ~9 Y0 l$ Ypd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
    - X4 K& R$ C4 F: J0 `% Z9 z4 u                       columns=[& Y) y- d# G' P1 ?
                               'sepal length(cm)', 'sepal width(cm)',
    , w( F- u0 G; m& P, N, P2 x( w6 t                           'petal length(cm)', 'petal width(cm)', 'class'
    1 r8 p, i* K7 v" a% ~8 z                       ])  U$ v3 B/ c" T' M% G4 C4 f
    with plt.xkcd():3 x( T) q# v/ p2 n! w! C( a
    : D$ [& {( E- F" c- X8 T2 N% d. n
        plt.figure(dpi=150)  #设置图的分辨率
    - z8 _3 C( N& x' ~. e7 s" Q+ }% i, y4 k    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
    ; W% O% T. j& d' K    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类" ]+ g0 U- N' A, X- L
        iris_name = iris.target_names  #获取每一类的名称% ]0 S7 k  t( Q4 F
        colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色# y7 O, b+ Z5 R0 c- ?! N& ~$ U
        markers = ['$\clubsuit$', '.', '+']  #三种不同图形# A8 r' x* @' ?) ]) G; Q1 G

    " p' I8 S4 c7 \, ~# z- j    for i in range(len(iris_type)):" D6 }7 Z( @+ @
            plt.scatter() u% C+ s& `% B; V2 S6 }2 M& J$ g
                pd_iris.loc[pd_iris['class'] == iris_type,0 D! G4 E8 D1 e, Q& Q8 k2 x
                            'sepal length(cm)'],  #传入数据x; ^, X+ j* l" r6 }3 Y4 R. K
                pd_iris.loc[pd_iris['class'] == iris_type,
    ' \* X( P0 T! C                        'sepal width(cm)'],  #传入数据y+ K2 Y( B! Z9 W8 c# T, x9 @2 x
                s=50,  #散点图形(marker)的大小
    / t+ f6 ~! [; V9 u# U3 J+ D3 I2 k            c=colors,  #marker颜色9 H( B" w' d9 X) T( x; m
                marker=markers,  #marker形状
    1 V9 ?2 ~& _9 H            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
    3 H9 K! s" g  H! I& k            alpha=0.8,  #marker透明度,范围为0-1
    + h2 x% j9 ]- z' U3 u  E' M6 ^# m            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c/ i) O9 C+ C: x0 V) ?/ U
                edgecolors='none',  #marker的边缘线色6 ^' H5 G$ Z8 x  L3 ?
                linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
    $ F  d4 B! m5 R            label=iris_name)  #后面图例的名称取自label( u; d- ~# F) z% d; B$ a, E

    8 P. Y$ o3 }, c; W# i6 c4 ^    plt.legend(loc='upper right')
    8 h. q4 x: {5 P4 K/ d2 g- x+ q5 \7 t8 W8 l+ v2 J1 s# S+ w5 m0 t
    $ P6 c( b) U: _2 B! ]
    ————————————————
    1 Y9 u: L& o# J) J" g6 w! t版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ V$ \5 P2 g0 F0 s
    原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
    . u5 `5 A0 `7 j: L; i9 c# k
    ) I1 ]1 u& T1 Z! L( _: p- L  j. M: V# |- E9 o# k0 u/ @
    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-9-1 10:19 , Processed in 0.386147 second(s), 50 queries .

    回顶部