数学建模社区-数学中国

标题: 一行Python代码有多强,可让图形秒变「手绘风」 [打印本页]

作者: 杨利霞    时间: 2021-7-22 11:56
标题: 一行Python代码有多强,可让图形秒变「手绘风」

- ?8 l( N& h7 d! j: q3 m- e6 m一行Python代码有多强,可让图形秒变「手绘风」3 Q" n- g" n7 q- \
之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
5 q& H2 l7 O6 X- W/ O3 _( l
7 t4 b* G8 u: s; _

& r1 k* X/ W# L但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。3 F' R! Y2 C/ I2 {

+ }0 b$ t" X$ v& m5 ]% k% T

: B. D. U' C! R, L" N4 Imatplotlib.pyplot.xkcd()简介+ l3 `+ z) Q' {$ P% r8 a
这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小$ }6 o6 S9 k! m
5 Y% F/ c: k7 U0 q7 ]: M
6 z$ \. p. ?" w( Q: v
matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度1 P3 O. Z  W% S! w) Y2 C
                       length=100, #褶皱长度; U  w" ~" W- \3 H$ @% m& z4 L
                       randomness=2#褶皱的随机性
7 W( ]1 R7 S. H4 q                      )
8 g4 \8 l- }6 H; ]/ V7 x) nmatplotlib.pyplot.xkcd()使用" t+ e  D) y7 D7 D0 ^6 c2 j
如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
, o4 y- ^3 B- G6 v' F' S1 U3 g: ?8 P3 K6 L4 `2 O0 q. ?8 U2 L; c

, \9 o7 _# D5 g7 ?: `' c& r4 [9 owith plt.xkcd(scale=1, length=100, randomness=2):
6 l( i( @0 S: {2 F0 p+ l* r#with是临时使用一下,不影响其它图使用正常样式, f/ ?- c0 C$ x3 E+ j1 O2 j( C
    绘图代码7 N, K. d7 ]. Z; y. q
    。。。。。。1 K8 L% m# E1 _# A
    plt.show()
/ z8 I+ Q, t3 @  x9 n9 ymatplotlib.pyplot.xkcd()使用实例 + H/ g) _" X2 B9 y2 `! e
下面代码为pythonic生物人公众号之前的文章代码  r7 N. V2 v4 B( s) d$ S
! u0 h0 y- Z) X5 j

$ \" L$ s8 U2 `$ f  I& d以下参考:Python可视化25|seaborn绘制矩阵图
9 p5 ?4 w" g" M# O& c( g' Z+ W" l+ t0 j  Q, r) ^

7 E  L+ X& J  H* V" m4 L#支持seaborn
& n5 ^% P  `8 `5 ~1 r+ y% f4 Pimport seaborn as sns* F+ d, h# h# v' b) s7 q! n/ ?. R. j
iris_sns = sns.load_dataset("iris")
! x8 o4 U. w& s( X) \with plt.xkcd():
8 {+ x9 s% f' t5 _    g = sns.pairplot(
0 [+ Q5 t, r' o$ c, ?. J        iris_sns,' X  \6 k! _+ C9 z4 V7 P
        hue='species',  #按照三种花分类# I, _0 h" O- a
        palette=['#dc2624', '#2b4750', '#45a0a2'])9 F% z1 K7 p2 Y& D5 y1 j. v
    sns.set(style='whitegrid')
0 C  Y9 N8 {* N8 h# s) M' q- x' F1 p9 e    g.fig.set_size_inches(12, 12)# U5 v" r* y! a' _- x2 c+ W
    sns.set(style='whitegrid', font_scale=1.5)+ r) I! o* X) x
  
& X( X- A( H! j. u" @$ O
& [, r& S( i# v5 k1 a: \( J

( c( f( z$ L% W! V以下参考:Python可视化29|matplotlib-饼图(pie)
% H" V2 S& y$ V" `- [' v; Q8 ^! n( t8 d% G5 W2 W' I' h

$ Q' [( U2 Y2 s- B3 a, gimport matplotlib.pyplot as plt
: ?. |5 M& a3 hwith plt.xkcd(2 V2 @) O8 y9 D# q% e5 |( a4 j; m( M
        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度2 c: Y0 x2 l6 D; m0 S
        length=120,  #褶皱长度; _6 b1 s. P3 b5 `2 v
        randomness=2):  #褶皱的随机性6 E, z5 J0 W- O5 f  A
    plt.figure(dpi=150)
7 F' B, _, G. v4 M    patches, texts, autotexts = plt.pie(& B) r) c0 Z7 S4 a. F; ]7 a
        x=[1, 2, 3],  #返回三个对象7 b. X- d7 Q6 f
        labels=['A', 'B', 'C'],
% Z4 h" z( w" m( _2 c# Q2 L7 T        colors=['#dc2624', '#2b4750', '#45a0a2'],
4 K& I4 Q5 N! O( {        autopct='%.2f%%',8 Y$ U$ b& l/ }  f: ?+ z8 _
        explode=(0.1, 0, 0)): @" w. I: ^& Q
    texts[1].set_size('20')  #修改B的大小
0 s5 b3 V9 \3 G3 t- K" L+ v7 j3 y: D 0 q9 T! a) i/ p. K# G/ _
    #matplotlib.patches.Wedge
3 A: Y. k! N* y, V# {6 H    patches[0].set_alpha(0.3)  #A组分设置透明度
* ^& _) E2 l) C& ~  Z# R2 u# X* u    patches[2].set_hatch('|')  #C组分添加网格线
. Z( Z7 P# t" C9 A3 a2 I, ~    patches[1].set_hatch('x')
# w: H" M5 S: R2 a2 g5 d
$ ~1 q4 l* ?8 z/ F- }    plt.legend(
) J$ J4 T5 `; H; Y2 Z+ M, L        patches,, {3 u! e( M8 F
        ['A', 'B', 'C'],  #添加图例
( P& R5 y: u- N3 l  ~7 I        title="Pie Learning",
" R; Q9 c0 ~. A7 e1 f        loc="center left",
, C5 V9 f8 C  u        fontsize=15,
0 B/ ~/ i0 F1 ~0 G+ i7 N" ^5 R$ H        bbox_to_anchor=(1, 0, 0.5, 1))4 h. E+ s; i9 G) h( p

: W9 S% b7 S& F1 }    plt.title('Lovely pie', size=20)
" l; ]! Z# _3 e4 b# z    plt.show()' H% O. T1 D, C
& G0 C; P* K9 ^! _
& F# _- b. r" c8 Y
/ i! w4 H( U9 V' p0 U

0 C  C* d! |# @+ `8 v- Jwith plt.xkcd():& j6 }& S0 d/ _/ t5 w0 y: ?5 \
    from string import ascii_letters
( H+ L% }7 f# e( f5 \( v    plt.figure(dpi=150)
( f# |0 A# a' \; J; I    patches, texts, autotexts = plt.pie(+ \; t9 U. o5 A. j# u
        x=range(1, 12)," B& T. o' d2 A& r. y% X  g7 d1 H
        labels=list(ascii_letters[26:])[0:11],
9 I7 Q5 ~3 \) I2 ~- E. L2 z9 G; o        colors=[/ d- c' T8 ]; a- j8 y
            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',$ J0 m7 O1 {' t) j9 m
            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
6 O) k* L0 C- \) G6 E        ],
: {" f: H% j/ s, B" T        autopct='%.2f%%',- |3 w1 o7 h+ m6 N
    )7 n: U  @7 p6 f( R0 p
    plt.legend(+ b% |0 _) D& G( G+ @% k: \
        patches,
! B0 _8 r& v! E( T+ m- e0 W8 o        list(ascii_letters[26:])[0:11],  #添加图例9 v) _6 M7 V9 [# ~' h
        title="Pie Learning",1 j' u/ y$ {3 ^
        loc="center left",
$ u/ r# u2 l9 Y3 J        bbox_to_anchor=(1, 0, 0.5, 1),
# g& a0 o8 U, d1 q+ m        ncol=2,  #控制图例中按照两列显示,默认为一列显示,2 [. P! |: f: S' H- l
    )
7 o0 q# I4 d6 S9 |" P4 \
5 @+ Z" ]0 z% X7 b- v, G0 L

; l7 H- d: i3 S3 a. u4 R9 a
/ {9 V4 r0 j+ W

7 v. M9 H1 q+ ^8 R% X+ _import matplotlib.pyplot as plt
& V1 E4 l3 \. y7 y, Wimport numpy as np
, s7 z& W# z$ O& W$ G  `with plt.xkcd():
8 Q# w: y9 v2 D" v! Y9 s, S# I    plt.figure(dpi=150)
, e3 e% e$ C# {! ], I    labels = ['Jack', 'Rose', 'Jimmy']
$ Y2 O+ j6 p8 X; c    year_2019 = np.arange(1, 4)
5 J/ S8 _: U' [    year_2020 = np.arange(1, 4) + 1* F% X' ?3 W* [. F- J1 Q. b
    bar_width = 0.4* a$ p. J6 B, P3 l3 P
2 U6 {4 J' G0 T4 v
    plt.bar(% g7 C: c' G7 k2 O8 c' E: {5 ~" Z
        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽  g; `3 t* E+ P( S' G( a- p
        year_2019,3 u# h3 z' E4 U- k- N
        color='#dc2624',
* P" B; X& B# [& S4 P; {        width=bar_width,
6 j! h0 y+ `1 V* e- c        label='year_2019'  #图例
# p) T* f% f2 M9 V! p    )# z; c: D/ z5 S- S9 F
    plt.bar(  S" d* ^, b" k4 i$ h8 ]
        np.arange(len(labels)) + bar_width / 2,9 @( d0 @' @6 b$ N
        year_2020,6 n4 m4 M7 T' T
        color='#45a0a2',( e, \6 Q) Z/ M0 {! F
        width=bar_width,
: k2 U& m+ p/ Z  ~2 _- @- }        label='year_2020'  #图例! L% ^: l0 ]; f6 I0 b3 s
    )9 h4 s$ [! G& J
    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称8 i8 d. ~$ Z% Y
    plt.legend(loc=2)  #图例在左边
( t2 X! Y6 `, ]: M, V) t1 V; z以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
  y0 m' y% m9 t3 K3 D7 S1 E4 C* J9 p9 j' T6 d, K% {3 H, g

; c- \0 n$ L: D1 X. h+ C
+ A; @, _: E. z! B  ]" U
/ I% F  D/ h8 D, f1 `! v
0 \# n8 P8 f6 h  {( p! |
( L8 G, P- W4 N1 D! R
以下参考: Python可视化|matplotlib10-绘制散点图scatter
7 ~0 G! l8 `- v/ v& o% j1 F; O/ `4 _
, W5 l, ~( j4 f, K

- ]0 c# d9 ^3 k+ L, o; Y$ k2 W& pimport matplotlib.pyplot as plt* K1 L  F" J1 B# r! i
import numpy as np
( S: @1 \+ L! W2 r2 a: _import pandas as pd
" c7 l6 s. e  M2 J6 i$ p" lfrom pandas import Series, DataFrame
% z& Z$ c$ j: i/ U& F& {#数据准备
/ K9 h- `) G9 _- p8 q* \from sklearn import datasets# M9 ~' @3 M* E

/ Q" ]+ t8 u; t7 viris = datasets.load_iris()
) ^) j9 d+ i6 Lx, y = iris.data, iris.target
' y7 B: w" |0 j; d: i1 Vpd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
* \2 [& `, o9 C. [3 A                       columns=[
4 l9 [# Q& j+ r% W3 D+ c) }& U1 Y                           'sepal length(cm)', 'sepal width(cm)',
5 W; N/ o1 m" g+ V; T                           'petal length(cm)', 'petal width(cm)', 'class'
0 R9 h/ l+ |% S                       ])
. u- j( l: M4 {2 _: ~7 L; h1 c3 Pwith plt.xkcd():
# V, h. S1 X( A- J7 K8 d, s 9 f5 H$ J" T3 o* ^" m
    plt.figure(dpi=150)  #设置图的分辨率
7 z0 B" B$ D0 a9 I  ~    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
$ K( N2 Q, X- d3 J( b    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
; a  X6 e  P- Q6 \2 d! F    iris_name = iris.target_names  #获取每一类的名称
, z( Y: S. f8 N" K7 r7 B    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
5 y4 ^" V( |' Z7 |' o" H9 p# b) E    markers = ['$\clubsuit$', '.', '+']  #三种不同图形2 ?; l) U. r; }' M) u" _* \
$ G+ A$ w3 X4 t4 U! k0 V
    for i in range(len(iris_type)):3 n. _9 S( J% |5 c6 ^
        plt.scatter(
3 `# C) e- W6 I6 d& J: \/ ^* M            pd_iris.loc[pd_iris['class'] == iris_type,
" v/ T' `' ^. s: ]! h6 t4 s7 ^                        'sepal length(cm)'],  #传入数据x
3 k/ i" R7 p& [( L' q) b6 Y            pd_iris.loc[pd_iris['class'] == iris_type,- W/ c$ l; }6 y& a7 x
                        'sepal width(cm)'],  #传入数据y& Y( c- Q) d$ W; P/ e
            s=50,  #散点图形(marker)的大小* c: e$ }- v1 v9 L' G6 F
            c=colors,  #marker颜色
. j' p0 Z. Z( V5 A% b- j            marker=markers,  #marker形状  B# I! ^# r5 t6 z4 e" G8 ?
            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充1 E, w2 B- L/ s* |
            alpha=0.8,  #marker透明度,范围为0-1
. N5 F5 y4 T! {  f: z  |# w            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
! ?4 k/ e  x8 d0 c            edgecolors='none',  #marker的边缘线色% Q& z* F: S  X5 X' D
            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用2 \' J) k6 V2 Y$ U
            label=iris_name)  #后面图例的名称取自label1 v. s( N8 D! v! _- @

" S9 ^& H8 P' I2 r5 D' ^. p    plt.legend(loc='upper right')2 p& E! `( L7 r4 U: h

5 y  j3 o/ S! ^& |2 R% a7 R0 h

' a1 J7 Y! @+ _) n4 E# c# a, D————————————————/ ~! [1 o! D( Q- ?  m# M
版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。$ g. {, a/ D* V- g
原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753( C3 V2 Z/ f  j; j

' y9 P  \0 d, ]7 a1 ]# O, |3 ~) K/ X6 t( F: C) S$ ~





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5