数学建模社区-数学中国

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

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

* k! }. c1 R: S$ S7 C一行Python代码有多强,可让图形秒变「手绘风」
8 ^5 E! ]1 v: W' {2 ], d之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
* }: h, p* x3 E! h- v3 y' M2 g. l* x- H+ x& \
, O) a1 Y( N+ @; X
但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。& w% I, c0 Z, y) `% Z! y
3 D+ M" q& \- Z" ]

: [/ G  \2 o, S+ Zmatplotlib.pyplot.xkcd()简介
5 W- J8 T0 S8 `9 i4 A" y" x2 H* I4 l这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小
# J- [% `9 Q3 r6 l2 \# x" J5 m3 ~* v! _
* r9 R- K! |- J* Z
matplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度! X  l, w7 `; y$ D3 U# v
                       length=100, #褶皱长度
2 Z. t& u2 J" N2 p* R9 n                       randomness=2#褶皱的随机性
( ^, I0 Q' I- d; ^6 k8 h% Y                      )0 h8 u; {0 w" i
matplotlib.pyplot.xkcd()使用
. d0 f8 V+ T4 l7 d0 Q0 m如下,加with行代码即可,括号中参数按个人喜好决定是否设置~+ O# a) }/ B4 n1 f# _* s( w
$ Z) E) T, L* q# w8 U; d' f: o# I

  h$ x" x0 N, m& ]; O3 ]" lwith plt.xkcd(scale=1, length=100, randomness=2):
0 e% O5 i! s" A#with是临时使用一下,不影响其它图使用正常样式
: p% p# u, t- q2 B4 P    绘图代码" Z+ ?' G, T7 X  X4 a/ R
    。。。。。。
/ {6 O/ v8 {9 ?* i    plt.show()" ^/ ^4 W' ?$ O' i0 y% @6 t
matplotlib.pyplot.xkcd()使用实例
/ k; _1 `. F. W: T- [7 B5 s下面代码为pythonic生物人公众号之前的文章代码
1 s* ^9 l1 X' T% o0 K9 f7 U+ G8 h: [
) A  z% Y4 }+ G; C: _2 Y
以下参考:Python可视化25|seaborn绘制矩阵图
1 T( y" T+ |- i4 p9 p8 p3 {' z

- f; x  O. L" p) w0 P. ~  Q6 `#支持seaborn
( a3 x4 S' R* H) q8 Nimport seaborn as sns
! k' O# V0 ?% u3 s/ B! G; P. M' |iris_sns = sns.load_dataset("iris")6 F& X* H- L' W* j. m" k7 x$ P9 ?  r
with plt.xkcd():
, c7 V6 M; z) g  ~* v. {    g = sns.pairplot(4 _! U& Y3 g  i; C2 p+ M/ z
        iris_sns,
$ D1 v2 n  g/ K' X3 Y: `        hue='species',  #按照三种花分类
( C# S* b( V3 P* C        palette=['#dc2624', '#2b4750', '#45a0a2'])
1 K2 o5 E& l: P' n1 b" H    sns.set(style='whitegrid')
& I# h1 ~: X8 _+ h& |    g.fig.set_size_inches(12, 12)
( u& ]  q' M6 `    sns.set(style='whitegrid', font_scale=1.5)
- X1 Z! F0 ?8 y7 c5 _; j3 s. a  5 B0 H" g# c7 o1 Z. W* @/ ]9 S

/ {  U+ O. U# @7 ?
9 W  k' a4 L, k0 T0 h6 c! B" D
以下参考:Python可视化29|matplotlib-饼图(pie)
  J* a7 k) C+ \  i; U! Z
# B# U# ?9 b+ L! p* v
- p! L5 e# Y+ O- t: u$ |
import matplotlib.pyplot as plt+ w- Z' d5 M% M! R" u$ B5 c0 I
with plt.xkcd(
0 T0 C8 I8 I4 I6 n( e        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度
( ]/ ]  `  z$ i. ]; g( a        length=120,  #褶皱长度9 i' g6 h! W# K: t: B3 j1 Q9 o
        randomness=2):  #褶皱的随机性
+ G- q8 j0 D+ N: |4 _1 M    plt.figure(dpi=150)
2 Q% C* T* ~" S* q3 |2 G8 ^    patches, texts, autotexts = plt.pie(+ X1 c$ C2 C$ P1 T1 Y: Z
        x=[1, 2, 3],  #返回三个对象: k8 C& n- T, Z9 n# R4 T8 Q; \
        labels=['A', 'B', 'C'],' X8 o* J7 q( e# P9 z
        colors=['#dc2624', '#2b4750', '#45a0a2'],7 g4 l7 {, S6 k$ e# w; ~$ w- r# q' A
        autopct='%.2f%%',0 U! d: j0 \4 T" M3 v
        explode=(0.1, 0, 0))3 `: A9 K8 B0 O0 @
    texts[1].set_size('20')  #修改B的大小* F. C) \0 a* X

/ Y' _3 A0 x' k" A1 j    #matplotlib.patches.Wedge9 P! W: d( Y& e% c/ U! V1 m8 @( V/ ~
    patches[0].set_alpha(0.3)  #A组分设置透明度( K! H% s. U3 ~1 }- m, ~8 W" W
    patches[2].set_hatch('|')  #C组分添加网格线
- E) @$ b8 O& \4 o2 o    patches[1].set_hatch('x')
! o9 B; {" o8 E" w7 C+ H5 [4 w5 c5 g# f
% B1 m7 P& P4 ?. h5 \    plt.legend(, n4 m: R  A5 a# T; z  y4 V
        patches,$ @  n8 O5 j* K- n9 F/ K
        ['A', 'B', 'C'],  #添加图例
: u- F' ~) G8 ~8 P: v        title="Pie Learning",  L0 E9 [4 f# @2 y
        loc="center left",
9 R' J7 n# w1 @8 z( |) |! d! |7 `        fontsize=15,! g2 o6 f6 F2 W4 {# B2 V3 o5 O
        bbox_to_anchor=(1, 0, 0.5, 1))% U' T; N: B9 Q, p! D/ V3 d( s
3 P) P8 U9 K$ j8 y0 R
    plt.title('Lovely pie', size=20)  p+ l! C4 h# ^
    plt.show(), K* N5 ~: a0 X. W- M* d

$ x/ }% O% h$ t' Q$ g
+ l  k0 e& Z' W6 C: r  \
) v& t. a5 K# e2 Z* ]/ O
" o& A3 T8 q+ }7 l! I
with plt.xkcd():0 E7 U! T) ^2 M- _
    from string import ascii_letters
% {: t- |& v9 Q  [) s    plt.figure(dpi=150), L. J5 B4 }& |  U' ^8 v5 H
    patches, texts, autotexts = plt.pie(
( E4 A( F9 ^  L$ C" G        x=range(1, 12),% |0 l5 \$ ~! O# {$ t* b
        labels=list(ascii_letters[26:])[0:11],8 f( X  K3 o% x: A; `5 s( i( }
        colors=[
4 X# S9 H( W  a* y" P0 t, B" [) b3 G            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
9 t8 D; `+ q- w7 r: s; `            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
! S3 u1 v. g( d% ?* C/ a6 w% V& }        ],4 ?; D' x9 C; \  o; ^. z
        autopct='%.2f%%',
! {" `3 J$ _5 o1 w( s: W+ ^2 m; u    )4 C  `$ J6 C4 z8 z& x* X
    plt.legend(
( ?  n3 J' i- a. G* q7 ~9 c" q1 i- q% ?        patches,
( v3 w7 y( m* q2 C+ t1 n        list(ascii_letters[26:])[0:11],  #添加图例
( t2 r5 x" W! ]7 a        title="Pie Learning",* W% I3 W, l: m4 x
        loc="center left",
0 ]0 ~% s  B2 v$ ]* L3 ^& j        bbox_to_anchor=(1, 0, 0.5, 1),7 m6 P' x4 J4 K, S6 e% Z# u5 F
        ncol=2,  #控制图例中按照两列显示,默认为一列显示,
9 h, P5 }, T$ J* m/ `; L& ^8 N3 r' ?    )
$ k: J2 c( F, \
  C7 {+ H  f' G% Z+ O) u

  s$ }+ E; z& I2 \6 e& Q$ ], r( U- X
3 Z; K2 Q- \* b! ~! }* D
import matplotlib.pyplot as plt
% Y  @* \+ O  D, C$ t3 D1 jimport numpy as np& O$ T: f+ y4 Q( {2 I! p6 D0 F3 L
with plt.xkcd():
# U: _! R9 @! P. [    plt.figure(dpi=150)
$ _  s( ^7 P6 Q/ ?  A    labels = ['Jack', 'Rose', 'Jimmy']$ m9 C2 S$ R/ A3 |7 B# j! Y/ q* b
    year_2019 = np.arange(1, 4)* s( j! \+ b6 _1 k# t
    year_2020 = np.arange(1, 4) + 18 A: A, Y; n2 v2 H4 H0 D
    bar_width = 0.4
+ c) Z5 V2 E5 x/ w8 O " J+ p4 v* M3 G2 |% P8 h
    plt.bar(; m1 J" b# ~2 ?* [/ Q
        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽
# h' L/ d  ~. }9 T        year_2019,  [3 G  `' q: B+ X) j
        color='#dc2624',
7 Q. M2 R# w# f6 K: A( f0 x& y) Y        width=bar_width,
7 c# R8 q! W6 a( \2 }2 c6 h        label='year_2019'  #图例
8 z" N5 _! ?/ f" \+ X& C4 y    )) u! ^  W4 X- V3 Y& B3 W
    plt.bar(
; r6 n. l4 r% O8 t3 K) N: l$ N6 _        np.arange(len(labels)) + bar_width / 2,
2 I- ^2 H4 J6 g% D: B$ }        year_2020,
" V* e5 Y% m: {$ e7 S/ W        color='#45a0a2',' e; T( ]: @$ i5 h/ A- d1 [
        width=bar_width," C' M5 `. P) M1 Z& E9 F. E/ v
        label='year_2020'  #图例
4 X. D0 Z! [' ]9 t: z' W# L4 z    )
9 O& r+ k8 I* _* Y! E    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称& H- a% `# @+ v& Z6 B/ t" `2 W
    plt.legend(loc=2)  #图例在左边
( _7 y- o# O6 n以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 ' l; q& e! s6 G& _, V
! ^' @, s% {: u; d. A, ?0 y
6 h/ g' C/ t. l& y" E. o; b, x$ b: d
0 T+ P; K. \; w( J, t  R$ W/ O

3 l- C0 `# v/ Y/ E( ?* X& `* H* ]- b, I8 ~

$ K4 a/ ~% \( {% i以下参考: Python可视化|matplotlib10-绘制散点图scatter) X% k# N* O! e0 h0 F- m+ \/ v9 p* |

0 o) h8 \9 q/ g+ G7 l, k
2 e6 L3 a- {5 F, s! p4 @# e6 x
import matplotlib.pyplot as plt5 a1 v* O4 |( d4 P% Z
import numpy as np7 U% V# d8 F9 j3 W
import pandas as pd
7 G) o# i& [7 h/ g* N% ]  sfrom pandas import Series, DataFrame' F7 M" a& [% u. T% T0 w; [
#数据准备
$ _3 H$ R6 \" ~" Nfrom sklearn import datasets
; R% Z$ c' a$ \/ S  s
1 e4 c. [0 d0 z: Biris = datasets.load_iris()
2 Z, t. r, d! R  {x, y = iris.data, iris.target
) o- b8 S$ d6 e$ n- n! H  Apd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
( Q- r: @1 D) ]8 y( I" M                       columns=[
" G8 |0 w% |4 B9 D" {( L                           'sepal length(cm)', 'sepal width(cm)',
9 @: P* m0 X* W( C1 f2 ^5 G) T                           'petal length(cm)', 'petal width(cm)', 'class'/ C& d) p( g7 U$ s4 f
                       ])
! D8 r; z1 H; p: fwith plt.xkcd():
. M$ b, Z$ ]( E8 C$ S( r - p( {$ T0 F4 F7 c7 Z
    plt.figure(dpi=150)  #设置图的分辨率
2 t/ j: ^- m5 l7 ~: V7 Y. e    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图& y2 I0 B6 q* X+ J5 ]5 X
    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
0 E) T# P8 L2 V% j9 F# N  }& H    iris_name = iris.target_names  #获取每一类的名称
' t8 X9 |. c9 U8 [- [; U" P    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
* w1 |; J, B& A- G    markers = ['$\clubsuit$', '.', '+']  #三种不同图形6 U" J+ V2 z; R* b  D& E0 ~
! r+ L( H9 z; a& r
    for i in range(len(iris_type)):
1 R3 K0 ~9 Y7 o, G2 o        plt.scatter(' D8 m% F6 {2 d
            pd_iris.loc[pd_iris['class'] == iris_type,. j( t+ A) l. X
                        'sepal length(cm)'],  #传入数据x
$ m- e3 N" |  Q1 E$ f) O" N            pd_iris.loc[pd_iris['class'] == iris_type,
# }5 J4 s3 \; H' F                        'sepal width(cm)'],  #传入数据y
+ C4 y* f; X( j2 V) Q' p5 @            s=50,  #散点图形(marker)的大小
" [1 C) f! K' A            c=colors,  #marker颜色
% r3 `" U# @9 l9 v/ P8 x            marker=markers,  #marker形状" q6 e! I4 c7 ^8 f$ N& b) e; d
            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
1 B8 }& t% B3 Z2 B) p7 u7 h: j            alpha=0.8,  #marker透明度,范围为0-11 r! ]1 K, b3 \
            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c
5 }2 ^8 [: e. s8 Z' s/ v            edgecolors='none',  #marker的边缘线色7 V; D% ?' c- p; N. n
            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
$ o0 }( A1 N8 I( C7 r9 t            label=iris_name)  #后面图例的名称取自label) O+ X; a( X. u7 c- h* S/ W
1 l% U7 f/ v9 o3 i* |2 I" q
    plt.legend(loc='upper right')) [4 h; a* M4 S" R

. G, R. d& X) a

5 R& E4 W$ N# T————————————————
) N" \& z. f% s  z) d版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( Q+ J3 |7 H; a1 G/ s% f) N原文链接:https://blog.csdn.net/qq_21478261/article/details/1189637531 _( Q' k! F3 |" G& G5 ?# _

/ z. P* N3 G1 n$ L2 B3 X) [6 ^- Y0 G1 V





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