数学建模社区-数学中国

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

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

) `+ o8 Z5 S, M* _/ M一行Python代码有多强,可让图形秒变「手绘风」& q4 p7 l. [+ ^5 R) c
之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具
" h$ Z/ L1 }. `: t% y( B* y
/ \/ P2 b  t! X& x) j! @' z: R, _

5 G! u8 G6 o2 \" w但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。( ?. l$ f0 v: l4 Q
0 Q% }) `' d" b' G4 u4 r

6 \% u7 Z! r3 U( B8 ~6 i7 pmatplotlib.pyplot.xkcd()简介
- \& z$ N2 v# G这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小% ~& ?+ G' {8 a) [2 K0 ?

% }: S0 p6 E$ \* Y

0 S; P# @3 r0 A; vmatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
: t- x; H+ C/ j+ L6 Y                       length=100, #褶皱长度
6 H% I* |( q4 [( }8 u( Y                       randomness=2#褶皱的随机性. f' m0 `* e2 R/ f
                      )
2 v  f9 |5 L, n9 q0 Rmatplotlib.pyplot.xkcd()使用
, f! m. x! p2 M# c- C如下,加with行代码即可,括号中参数按个人喜好决定是否设置~# @0 W" ?# i  S5 V+ F
" g7 E- L% }/ A( H( y3 X
$ @+ e. z) l- e4 y, y' z4 h7 O6 _
with plt.xkcd(scale=1, length=100, randomness=2):; b6 K$ ]# e5 a5 G5 @
#with是临时使用一下,不影响其它图使用正常样式
! M8 q1 [) K2 f6 V; B' p    绘图代码
$ d: z; ^0 U: P  H- Z# E    。。。。。。
6 H0 z4 w2 w6 n+ i! V- [' E. ?    plt.show()5 H8 C5 w1 z. ]
matplotlib.pyplot.xkcd()使用实例 / b7 ^* z5 @4 X' K: p- I1 x
下面代码为pythonic生物人公众号之前的文章代码. `" |) I+ u6 m8 |2 a, \8 s" k

& Q; z2 @/ P9 A& x3 ~# U

6 z. c/ S2 l! H; R以下参考:Python可视化25|seaborn绘制矩阵图/ H# d8 E! k. p6 _. f4 r$ Q
/ v! W/ E% b+ n6 J- n* |

% O. I; U* l7 d( ~* }1 {#支持seaborn
8 |3 A4 g& c( A8 G; i6 rimport seaborn as sns5 ?* f! w6 l1 M$ u5 j) y9 Y, o
iris_sns = sns.load_dataset("iris")
9 p9 K! ~) m/ `- e7 D7 b8 ewith plt.xkcd():
8 w6 s# \2 ?3 D+ K* K$ A7 P+ m1 g# Z    g = sns.pairplot(+ `5 n! d( {+ ?
        iris_sns,
/ h$ m2 b: p0 i# o+ J$ {1 d        hue='species',  #按照三种花分类
# `3 N3 F5 n- k1 J: w        palette=['#dc2624', '#2b4750', '#45a0a2'])) Y' n$ ^; j8 \9 G
    sns.set(style='whitegrid')
+ c* }3 W( E7 ?! y    g.fig.set_size_inches(12, 12)- S' \  Q8 L$ C) D
    sns.set(style='whitegrid', font_scale=1.5)
6 U% M2 b9 b: q9 x. s- P: y2 F& r  
; C* P. j. d( i, h' O3 M( P2 `! b8 S2 J. F7 }, Z

8 G4 f1 n0 s3 N以下参考:Python可视化29|matplotlib-饼图(pie)
, d( ?+ S- ^! y5 v- B% u' a( I; \1 D! ~0 |
- O1 w1 |* A( S2 m" O9 L+ F
import matplotlib.pyplot as plt, b2 ~) q: P: W. q1 p6 F4 Y: f
with plt.xkcd(
& S! k' O( n/ M4 B        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度% o3 D5 _  w3 [4 B% t
        length=120,  #褶皱长度6 v1 Q& C- [, J' U
        randomness=2):  #褶皱的随机性
3 ?" o: d9 P( d8 x4 i    plt.figure(dpi=150)0 i% D* b' ?& L$ p- Z' b" d: ^
    patches, texts, autotexts = plt.pie(
2 F: k9 J- z7 t! l        x=[1, 2, 3],  #返回三个对象5 R7 s( g/ z# ?2 i
        labels=['A', 'B', 'C'],
7 b1 X- d5 C; [* D. {        colors=['#dc2624', '#2b4750', '#45a0a2'],
( ?% V' O. ], F' T$ {        autopct='%.2f%%',
! ^9 r# C" j/ p3 D* Z        explode=(0.1, 0, 0))/ D% t9 r, j6 m5 m
    texts[1].set_size('20')  #修改B的大小) ]* t# h, J& p9 V

$ ^3 i* Z' H* p! F8 L8 S6 L" P. Q    #matplotlib.patches.Wedge
3 l. M% ]  {9 w: d    patches[0].set_alpha(0.3)  #A组分设置透明度
+ t0 H9 Z( y  @2 a    patches[2].set_hatch('|')  #C组分添加网格线
4 g" N% N0 B! }* `' H( p8 J    patches[1].set_hatch('x')$ T2 i! D$ I2 [! n" s3 B* y

( L8 `1 K0 a/ }2 p+ N7 O    plt.legend(* {8 G1 Q) u) Z! ~7 @) s
        patches,$ J8 V1 A. e; A6 L; p4 t
        ['A', 'B', 'C'],  #添加图例
" K2 ?0 A! q3 T( R3 {        title="Pie Learning",
2 p) }( y$ r2 D        loc="center left",
' {: A! a4 f* F# E$ v        fontsize=15,8 J( _- Q  v1 |* u/ G5 }* g& @/ ~
        bbox_to_anchor=(1, 0, 0.5, 1))/ X4 ?! j) B2 t. @( l4 S% b) Z
9 V  [5 m& I8 g3 _/ D1 W
    plt.title('Lovely pie', size=20)- H2 B+ y7 X/ i% K: Q$ m/ d
    plt.show()
4 s' o  H! y9 @* G. G4 P5 t/ r+ J0 [$ H7 k7 m
* k2 _; N% m# b: T  ?3 {6 ]
. q8 y9 N, k" K% ~- [& ^) u' }
2 X0 Z0 g; K) Q* w& j/ t* `
with plt.xkcd():5 {6 y# O: k% }  d9 O+ T0 J/ E2 d
    from string import ascii_letters: U7 u& S- o3 ]: O& z# [
    plt.figure(dpi=150)6 |- {; Q+ K' [$ @' d5 u
    patches, texts, autotexts = plt.pie(6 K; I( P5 b1 m
        x=range(1, 12),. _9 `1 v$ q+ ~* M
        labels=list(ascii_letters[26:])[0:11],, p" T4 K) q5 r: ]* y. d- R
        colors=[8 P6 a  H+ N- l9 x7 y- r* T! c
            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
6 m% k' x3 F5 W9 m8 q7 U# O/ q            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'7 {) J: ~3 K! R! y
        ],4 f. S2 }8 S! }; e# @2 I
        autopct='%.2f%%',5 _" J5 ^/ L1 _2 y8 R
    )
0 K2 u( w- h5 @2 i7 C- O: D3 ?    plt.legend(
1 I1 D4 ~) W: S; O: ]" l  R$ H3 K        patches,1 ^5 M# _# M: F9 L
        list(ascii_letters[26:])[0:11],  #添加图例5 F+ f8 j( }" u" Y( J6 z' |
        title="Pie Learning",
  W) G( D7 W1 u0 W$ U        loc="center left",
0 K; P+ s* E" }        bbox_to_anchor=(1, 0, 0.5, 1),
/ P" c# \9 b* |. u2 i- @( }. P        ncol=2,  #控制图例中按照两列显示,默认为一列显示,
5 i0 _  W$ K2 M0 W' z6 Y# d  ^    )% a1 p5 m4 l8 ^% ~4 S* _0 }
' X3 p& u) v! P9 j$ D- ^5 G% Y( k
0 O- I0 Z: T1 r4 `. \7 u9 f
$ R1 Z+ i* @' c- b

( d% n0 e# X2 Z5 Timport matplotlib.pyplot as plt# I7 u8 L  o$ P' q, I) O! Z! |# B
import numpy as np
: ?0 @) H% q0 }& s% Y, v4 Owith plt.xkcd():4 l1 F9 w' C" h- Y6 H; I
    plt.figure(dpi=150)
  H. x' r+ O  \) X+ \" |    labels = ['Jack', 'Rose', 'Jimmy']! S# m6 \+ A- p, n$ z2 W" v
    year_2019 = np.arange(1, 4)
3 O0 p' ]& O8 E$ _+ [# y; `6 c    year_2020 = np.arange(1, 4) + 1
6 [: n* }2 J6 C9 G5 D    bar_width = 0.43 ^& w4 a9 U0 I: `# i

1 d$ K% D/ o- }7 }# A5 W    plt.bar(
$ a  m5 ]; j+ ]4 @        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽# q+ V2 f( L5 w' K, a
        year_2019,
1 m$ c% e- C; |! A0 ]' a7 v; w        color='#dc2624',
( i9 `6 U3 t/ D: _2 \+ |' T8 f6 [. I$ i        width=bar_width,
5 Z6 Y, [1 E+ p$ q" T/ B+ x        label='year_2019'  #图例
7 ]3 v+ r! P' a' U: y; u! x& M    )" k7 _" l; z8 V5 u9 K% a- r
    plt.bar(! K* ?3 E3 N9 q% }2 P
        np.arange(len(labels)) + bar_width / 2,
0 T; n9 S  N: [- Z( g$ N: E        year_2020,
1 U- E' v$ l* K9 A, E2 v        color='#45a0a2',- u7 d1 {+ s) s" W: n" v/ q
        width=bar_width,( ]7 m) q8 H" g- W! R2 u
        label='year_2020'  #图例
* [8 i) S' ^& s; N& r    )
# M3 n1 z+ y7 p0 I5 j. D/ T1 J    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称* }/ }! E% ?8 z& N$ q8 n' s
    plt.legend(loc=2)  #图例在左边7 h: H! F6 z! J0 \( M/ M7 ^
以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解
3 l/ H- A* X5 W: C9 u8 q& f1 l9 i" X0 G' e3 x" }9 \+ N
# X' R# K' r+ m0 v0 r; y

* h7 r. x+ `7 X, k

: X: i: T( [& O2 G% t/ Z: |! c0 r4 N/ y$ O- K8 D

. w) o$ Q0 Z7 I, a2 ^, B1 u以下参考: Python可视化|matplotlib10-绘制散点图scatter, M( d$ X6 s8 G7 X

, J2 _2 b# L. t

, a. P$ r* N! W+ F, |$ eimport matplotlib.pyplot as plt
: O& G7 e8 d. e, g: Himport numpy as np
5 H) b5 N5 g8 q4 m% mimport pandas as pd
( Y, `0 U( q! D( [# Ffrom pandas import Series, DataFrame
* S$ M* d4 h, `, E#数据准备
1 R4 q: [% J- r( O2 a# j4 `from sklearn import datasets
4 D2 i/ n# S* a! a. }1 I - K4 W, i* k; ?" s% o) r
iris = datasets.load_iris()
" ~% O+ @7 s, Gx, y = iris.data, iris.target
$ N# M5 `1 [0 b$ L4 q3 F) L5 }pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),
- a3 F8 Y" @) l( \  s$ k& z( v3 l: F                       columns=[
5 w! s" d- H' \& s3 l) U3 \                           'sepal length(cm)', 'sepal width(cm)',
2 Q6 x  V- y$ ~; h( q% J/ R1 K                           'petal length(cm)', 'petal width(cm)', 'class'$ E8 W0 H: q9 |5 r$ `( e
                       ])
% E: n3 X$ k% R$ M. l: Xwith plt.xkcd():& ?5 \; p. M( v1 N" Q1 t9 I
  q/ ^) L1 S9 y6 y; U* W0 J) V
    plt.figure(dpi=150)  #设置图的分辨率
0 L, g6 e0 t/ Q( K+ F    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图; F9 ~5 z* D: h2 K- U
    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
3 c, b: l% w7 q) D4 p    iris_name = iris.target_names  #获取每一类的名称
8 G" C! Z, w) l    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色: @; e: C. L/ A$ v# x& m
    markers = ['$\clubsuit$', '.', '+']  #三种不同图形/ z9 r" M2 Q  e) z7 y# b' k

2 L$ T; R7 q8 v4 B9 H1 m9 C    for i in range(len(iris_type)):
1 G% Z# [+ O. t  l        plt.scatter(
" o9 {; }1 u/ x  n            pd_iris.loc[pd_iris['class'] == iris_type,
2 H: I  ]; ^$ B- P                        'sepal length(cm)'],  #传入数据x1 g$ Q/ {% A" [4 i
            pd_iris.loc[pd_iris['class'] == iris_type,
5 V* }/ y8 T, Z' e' O) R                        'sepal width(cm)'],  #传入数据y% [. n# p+ u, G, I
            s=50,  #散点图形(marker)的大小# ?; |/ H, E3 Y" S5 H- B8 m
            c=colors,  #marker颜色
. A& Y+ e/ L! K. {6 w            marker=markers,  #marker形状% I" ]+ U6 w) b9 a8 ]% z- I' {+ u
            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
. v* C/ y% c6 c& @9 _9 z, G            alpha=0.8,  #marker透明度,范围为0-1& y# U; T( W3 f) U6 {- i
            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c- Z4 t+ E8 b0 p/ y1 r- d+ S
            edgecolors='none',  #marker的边缘线色  D7 B% A  h0 t% t
            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用5 B; |2 F/ Y1 _) V7 {4 x  f6 g* W+ S1 T6 S
            label=iris_name)  #后面图例的名称取自label
5 e, i1 q' n" F6 b2 Y1 C+ b; f 6 w( j; w7 c( w
    plt.legend(loc='upper right')
& Q) }2 i% v" c+ d' V3 S: p2 h2 C4 [6 N: @) t& m
8 K; M6 m* U1 i3 J; }2 o
————————————————
: s* G, S/ q, N! a5 k. n版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: w! I9 j* H2 c2 u9 m2 W' j3 ]原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
/ T5 m. O0 t( \  W2 @9 _1 J) Y; S
3 @, p# w) e# F6 v. a6 M$ ?9 F: P





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