数学建模社区-数学中国

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

作者: 杨利霞    时间: 2021-7-22 11:56
标题: 一行Python代码有多强,可让图形秒变「手绘风」
7 i6 f/ r! i5 J! U( E5 h7 ~0 c
一行Python代码有多强,可让图形秒变「手绘风」$ |# |) I' H' K
之前介绍过一个绘制手绘风格图形的工具cutecharts:一款蠢萌蠢萌的可视化工具, Z% L+ k$ e3 q- H# j) s: x# r

9 r8 V& R* o  V8 U3 z: ?& ]

; ~! @2 s' \- K0 @& L# `但是,其功能有限,今天再介绍一个手绘工具(matplotlib.pyplot.xkcd()),一行代码可将所有Matplotlib和Seaborn绘制的图形变为手绘风格。8 _, |* G5 p" N% \
0 Z* D8 ~7 m' v5 V  s& f) ~; s, [
. f6 |3 }( k5 M4 h2 C: C
matplotlib.pyplot.xkcd()简介
& A4 H* Z# b, Y0 J- x这个Matplotlib子函数特别简单,只有三个参数,别看参数少,但功能可不小7 t; h$ a1 X8 E
$ F+ l7 }4 h" A  }

, c# P& _6 o9 Cmatplotlib.pyplot.xkcd(scale=1, #相对于不使用xkcd的风格图,褶皱的幅度
) X1 y( l1 f% Z# c& M* }                       length=100, #褶皱长度0 r  h5 p/ o3 X! B
                       randomness=2#褶皱的随机性7 j6 P9 w7 r  o+ F+ J- C( y) c2 S6 \
                      )# E$ x) C# }% F
matplotlib.pyplot.xkcd()使用
5 R, i+ @/ B* U) E0 d" P如下,加with行代码即可,括号中参数按个人喜好决定是否设置~
( H  {/ j& V) |2 C# d8 A9 d6 `/ u# T. y
: Q4 f: }2 A3 j- J
with plt.xkcd(scale=1, length=100, randomness=2):
8 J2 T+ F& t- A8 @* \/ b7 e% A+ `#with是临时使用一下,不影响其它图使用正常样式1 j* x9 S. _0 C% d, S( w
    绘图代码
4 T8 v# [$ d" R: h    。。。。。。, _' }5 u9 j1 D2 U2 ^2 X& k. u
    plt.show()& C  r' v1 W# k8 g1 V' o6 g: G6 y
matplotlib.pyplot.xkcd()使用实例
$ n. p5 ^2 \4 u, H4 K2 X  I下面代码为pythonic生物人公众号之前的文章代码$ V$ d$ e& D  m

' d  M( c6 s9 \. u5 J9 w
& G8 Z7 ^. T6 D) H* S" H5 [
以下参考:Python可视化25|seaborn绘制矩阵图
: l) i$ D9 A1 O# \! [% x% N) i, S+ K$ {$ k$ v4 f

6 L; c7 u7 l: h/ y) L#支持seaborn- ^8 \( t. O+ K1 G  j
import seaborn as sns
) l* v' u6 B% F( \- N; f( Tiris_sns = sns.load_dataset("iris"). h- n6 @) \; m9 e% T
with plt.xkcd():3 Y' q/ |2 U) o9 l. b; j
    g = sns.pairplot(
4 T- M. e2 U* h" N# r7 l        iris_sns,0 F$ {# F4 H5 `; T, H& z9 d
        hue='species',  #按照三种花分类
- d' O1 l5 @2 Y# J( v: z        palette=['#dc2624', '#2b4750', '#45a0a2'])
6 p5 ]( n# @7 i3 S1 e    sns.set(style='whitegrid')! s# m7 m; I( f; R# v
    g.fig.set_size_inches(12, 12)
+ D4 d# ]7 s! T: j    sns.set(style='whitegrid', font_scale=1.5); e' q2 S+ w6 C' C
  
* c$ v% \  P) s& M0 e
( ?! |8 x) s/ z$ @1 |2 i( Q8 k
- ?/ N  l( ]/ X: Z) a
以下参考:Python可视化29|matplotlib-饼图(pie)
3 H) g1 ^. Q' ^- v" g3 C8 E5 \; M8 D: f+ F/ s
& P' |" x8 Y8 i; r: s& }
import matplotlib.pyplot as plt. f; O% R  o4 a: Z5 Q& h  l$ z6 ~4 o
with plt.xkcd(
  t. ]; o0 \7 n. Z        scale=4,  #相对于不使用xkcd的风格图,褶皱的幅度! M6 X' A! I' Q, b/ D" a' b, d
        length=120,  #褶皱长度
4 e2 A' Q$ y' s8 o; |; e8 k        randomness=2):  #褶皱的随机性
" R/ n7 `8 J+ j  B8 O# |9 z5 `    plt.figure(dpi=150)
( G0 A3 p, b) Q2 ]& |$ r    patches, texts, autotexts = plt.pie(
2 X: V5 `& ]8 G% x0 l* V2 A; w/ W        x=[1, 2, 3],  #返回三个对象% n( @' z1 U9 z, ~
        labels=['A', 'B', 'C'],
( a! o! Z  w# p        colors=['#dc2624', '#2b4750', '#45a0a2'],! u1 l: L8 N$ Q% `# l/ ?
        autopct='%.2f%%',
2 i0 w4 k6 m+ W8 F4 Y9 C, M        explode=(0.1, 0, 0))
- k+ c' J8 d$ P( I# o' }    texts[1].set_size('20')  #修改B的大小* B% z/ ]+ e. `; i
1 Q. i  `0 ?4 r$ \; b& G! R
    #matplotlib.patches.Wedge
6 `8 ]* b9 k% n+ c8 y1 t    patches[0].set_alpha(0.3)  #A组分设置透明度
6 K8 M" e. q' t: N% z4 c( u" [    patches[2].set_hatch('|')  #C组分添加网格线
0 W) u$ S, _- }  ^. X9 D# Z' B    patches[1].set_hatch('x')* s7 e3 B) o* X! |5 G

8 B& |$ m6 z; ]    plt.legend(7 R3 e* ^/ p( y, w7 b
        patches,
$ k1 i7 a. t# l. N' ^        ['A', 'B', 'C'],  #添加图例! o- ^6 x. j3 E8 L* u2 T
        title="Pie Learning",
$ Z/ r3 C* ]4 ~$ W$ V' u% n9 L        loc="center left",2 ]# I7 B+ l; Q: ~
        fontsize=15,. i% c$ y7 K% C* O# I- {9 T% |
        bbox_to_anchor=(1, 0, 0.5, 1))
# W. h5 ?& Q' q" F( k0 a" U$ Q% G& e * M" e6 c, k- B! ?. c
    plt.title('Lovely pie', size=20)1 i7 b, b7 \! T9 M& r
    plt.show()) @7 |# X) ]3 `& h! ]
7 }. ]/ Y- K+ [& ?
4 q& X2 h/ }( l) P$ D9 X
8 q3 e  K/ }+ c5 n. g  B3 d8 B

) C, N5 s" v5 B  _9 `4 ~with plt.xkcd():) ~3 x3 i- |( g$ @# ]1 t5 `" W
    from string import ascii_letters
0 w2 ^/ q! u4 p: G    plt.figure(dpi=150)  \. E. r9 [+ v7 q/ E+ O
    patches, texts, autotexts = plt.pie(
3 Y8 f, g: D$ h3 j2 u        x=range(1, 12),* O: G8 Q- V/ j2 o
        labels=list(ascii_letters[26:])[0:11],9 L- Y4 W# u6 N& f4 X, S  d! ~7 g9 V
        colors=[
- D: t1 {3 I; B* @8 p9 v            '#dc2624', '#2b4750', '#45a0a2', '#e87a59', '#7dcaa9', '#649E7D',
( n5 ~5 b" V4 ?8 \; D3 c            '#dc8018', '#C89F91', '#6c6d6c', '#4f6268', '#c7cccf'
9 y  _) i% {# V        ],
8 i, R# X9 ~9 i' p        autopct='%.2f%%',
4 F) D5 I7 H7 j7 t& u4 m$ ^    )# ~5 U& o5 X( V7 X6 w& t
    plt.legend(- u# w  Q& G* ?( x! g4 {
        patches,$ w9 @/ @! I/ @# K4 d
        list(ascii_letters[26:])[0:11],  #添加图例  Z/ o/ ?: L" c0 s6 p
        title="Pie Learning",
* R' U9 W; [6 {$ e0 n  W4 M        loc="center left",/ i3 d! _% c( C  W2 D! K1 z* ^
        bbox_to_anchor=(1, 0, 0.5, 1),
% C* Q* @1 S" l) e& Z        ncol=2,  #控制图例中按照两列显示,默认为一列显示,
; K' b0 y0 F$ i$ p4 O) p2 p    )2 b! Y7 b4 O& `' K3 g! A- m5 `4 J

& N% j6 K* J& r" J( E+ X* {4 V1 g# h
! r% h/ r. g) N7 z) k1 c* J

4 ?3 [$ r) l" j- z" y
) D7 ^5 R4 F! r8 e7 @
import matplotlib.pyplot as plt
) C6 o7 ]8 k0 I; E8 e* R. }' t7 vimport numpy as np: t# s& F3 }' [# c
with plt.xkcd():0 ]+ i. G: R) ~/ o/ I% e
    plt.figure(dpi=150)* Q" r! ~2 |' r, i2 U
    labels = ['Jack', 'Rose', 'Jimmy']6 E8 a% z' u( X" T2 D2 V" Y
    year_2019 = np.arange(1, 4)  \1 r) i2 L1 Q! K2 E( @
    year_2020 = np.arange(1, 4) + 1
! ~/ p/ R; D8 a3 X4 L' l1 w% Z8 a    bar_width = 0.4* u; l2 g3 x- A( Q' I/ y( ^6 o
5 [1 l; R% L, G( N
    plt.bar(1 F" |) C' S9 R3 |0 I/ p
        np.arange(len(labels)) - bar_width / 2,  #为了两个柱子一样宽/ ]; A8 q+ Y( E; I3 j5 m+ Q; |
        year_2019,
8 O( k" H4 J& ?( ^        color='#dc2624',
5 J; B  h+ |8 }* [        width=bar_width,* @3 U$ T0 ]% A9 k3 v
        label='year_2019'  #图例
  R& T7 F/ M8 M# r6 H$ x* t9 T    ). m8 P* P/ v# v$ o' q
    plt.bar(
  \9 n! k# K1 H$ _- T6 ~6 c9 Y6 \        np.arange(len(labels)) + bar_width / 2,
" O% n- G9 L7 a        year_2020,
/ V& @. W* g# l6 E# D: Y0 H! I        color='#45a0a2',
% R; b0 i  U7 b7 q; {/ K/ F$ U1 p        width=bar_width,
# O1 |4 f0 c# w6 F# A1 a        label='year_2020'  #图例  R; @2 \2 A4 H  ?- g# X
    )/ l% a. Y, l! H
    plt.xticks(np.arange(0, 3, step=1), labels, rotation=45)  #定义柱子名称: l% r& [7 r) y) N
    plt.legend(loc=2)  #图例在左边
! I" I+ F& e1 k& _以下参考:Python可视化|matplotlib12-垂直|水平|堆积条形图详解 8 r) @9 v+ `+ J- R5 B
0 x) v9 F7 M: B! @- j' L

9 K3 O7 i" M) P' ^( [) ?! }$ y% }5 {) Y% p
8 `: p- ~! v8 T; m6 a

  ~' Z, k# o. t) t% H8 E; i5 ~
' f# ?! `! s; b8 ~( T
以下参考: Python可视化|matplotlib10-绘制散点图scatter# `. E6 y4 _* H1 f. g
# S. z/ Y8 Z; W+ m$ ~" R: K' T8 W, E
5 @4 l* Q4 s' c
import matplotlib.pyplot as plt
' L6 @) _, f9 K- }7 I9 y& ^import numpy as np2 n1 v$ u) j, F5 V9 T; D
import pandas as pd# q' c/ ^0 K' e( O; u
from pandas import Series, DataFrame
7 Q" i( v/ g1 x4 x3 n#数据准备: V2 I( D* u! p: Y
from sklearn import datasets
% T9 B3 U9 f6 A  n2 b: F: C6 H% o ( P! k" U& v, s5 r
iris = datasets.load_iris()( n! K; }- d* l8 V5 ^5 K
x, y = iris.data, iris.target( e) @; B+ \/ v4 r2 O
pd_iris = pd.DataFrame(np.hstack((x, y.reshape(150, 1))),/ |& _9 R; @2 [4 T
                       columns=[" v, a' k' Y- ~% {! _/ c* \* S- h
                           'sepal length(cm)', 'sepal width(cm)',- V4 B( H- A) I; [
                           'petal length(cm)', 'petal width(cm)', 'class'
) }8 Q' q. [, H, ]& V4 f- Y' R, q                       ])
- ?  K( r4 V% ^+ gwith plt.xkcd():) Y8 B4 @9 O" J3 H5 E1 k# e; L
% u+ g" V+ z/ ~& H5 n8 ?: [
    plt.figure(dpi=150)  #设置图的分辨率
7 M& v9 l2 R9 H* K3 w" C    #plt.style.use('Solarize_Light2')  #使用Solarize_Light2风格绘图
/ u. R+ ]& ^# a/ D) [8 W# o    iris_type = pd_iris['class'].unique()  #根据class列将点分为三类
) t2 }+ _9 e4 N: }4 U( H6 [" f2 k    iris_name = iris.target_names  #获取每一类的名称
( p0 c8 [9 p: i. d' q6 Z0 J9 T7 J    colors = ['#dc2624', '#2b4750', '#45a0a2']  #三种不同颜色
6 F1 G; `  P6 K9 f5 f1 T    markers = ['$\clubsuit$', '.', '+']  #三种不同图形5 ]1 B$ f8 S& k/ D& [6 R* G2 ~+ l# @6 W

- o$ S' C7 z$ H( u/ p    for i in range(len(iris_type)):7 _: O- H+ \" Y8 m# `$ r; H
        plt.scatter(
) K' t; y! l4 x) F- |/ _7 ^$ S1 _& H            pd_iris.loc[pd_iris['class'] == iris_type,: u) S+ z! m4 k
                        'sepal length(cm)'],  #传入数据x8 T+ ]  U% o' L2 f1 }
            pd_iris.loc[pd_iris['class'] == iris_type,
- K- B0 R3 R! v/ R% J) b1 a% ~                        'sepal width(cm)'],  #传入数据y8 g- w3 p: A$ v( S
            s=50,  #散点图形(marker)的大小
; J7 s  d1 |4 Q7 B( d! n7 \            c=colors,  #marker颜色- B) G8 t% Y4 q9 a" ]
            marker=markers,  #marker形状* }4 C" G& K4 _2 J. T) m
            #marker=matplotlib.markers.MarkerStyle(marker = markers,fillstyle='full'),#设置marker的填充
7 {' }, e0 J; @! w- e4 v' U6 P' Y            alpha=0.8,  #marker透明度,范围为0-1
- T: N' K8 w2 Y8 d, Z- f0 K( V# l            facecolors='r',  #marker的填充颜色,当上面c参数设置了颜色,优先c2 n* N# ~( ]; T9 C4 ?2 U
            edgecolors='none',  #marker的边缘线色
9 E2 ~" F$ Q& Y            linewidths=1,  #marker边缘线宽度,edgecolors不设置时,该参数不起作用
2 }9 ~, ^; b: b& d3 ?            label=iris_name)  #后面图例的名称取自label8 I- g# Z7 o% G1 `, y! q  O

$ B% w2 k. n$ }9 T8 P! V    plt.legend(loc='upper right')
" c' ?- u" o, ~
  S) |) i0 ]  a
' [- t1 \8 ]% p' @( }% P
————————————————
5 u; M5 T, e/ `/ M. `$ M" a版权声明:本文为CSDN博主「pythonic生物人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 K$ j% H6 [. @, j4 A
原文链接:https://blog.csdn.net/qq_21478261/article/details/118963753
0 a2 @/ j4 ~) I$ ^
- p& B) ?, o- O% v
! K7 H/ t- [9 T1 C




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