用matplotlib绘制漫画风格的图表

自从有了计算机,便很少有人手工绘制图表了。计算机绘制出的图表横平竖直,可以随意使用各种颜色,也完全不用担心画错需要重来的问题。

但有没有一种感觉,看多了工整的图表,变得有些审美疲劳。在各行各业逐渐过渡到计算机绘图的时候,有些人开始怀念起手绘来,只不过用全新的方式——触控板来进行手绘。

1 用Python的maplotlib包绘图

平时喜欢倒腾一些数据,没少画各种图,最常用的是Python的Matplotlib包,简单的几行代码,便可以绘出精美的图来。matplotlib包模仿了MATLAB的绘图接口,想必用过MATLAB的人会很熟悉,本文并不会详细介绍各种绘图的命令,只是展示一种可能性——在图表里增添一点涂鸦的美感。

比如,我想知道篮球比赛里,得分的分布是什么样的。于是我就爬了美国大学体育协会篮球比赛的得分数据,加上几行代码

mean = sum(data)/len(data)
std = stdev(data)
data_range = (min(data), max(data))
x = np.linspace(data_range[0], data_range[1], 100)
norm = stats.norm(mean, std)

plt.hist(data, normed=True ,bins=max(data)+1, range=(-0.5,max(data)+0.5), color=‘green‘, label=‘实际分布‘, histtype=‘stepfilled‘)
plt.axvline(x=mean, color=‘yellow‘, linewidth=2)
plt.plot(x, norm.pdf(x), ‘--‘, label=‘标准正态分布‘, color=‘red‘, linewidth=2)
plt.xlabel(‘一场比赛的得分数目‘)
plt.title(‘NCAA篮球赛得分条形图‘)
plt.legend()

就有了下面的这个条形图

没有意料到是一个完美的正态分布,再也没有比这更完美的了,这就是数据可视化的魅力。

2 xkcd模式

xkcd是一个关于浪漫、讽刺、数学和语言的网络漫画,画的往往是geek的幽默,我表示很难看出笑点在哪。xkcd在geek圈的影响力可谓不小,当年xkcd画了一幅Python的漫话,说用Python编程,就像在云端漫步一样,比喻利用Python提供的各种各样的包,可以实现快速地开放。

漫画里写着I JUST JTYPED import antigratity,过后没多久Python的开团队就在Python的发行版本里,添加了一个antigravity包,import这个包会直接打开这幅漫画。这是真的,查了一番资料我才确定是先有的这幅漫画,再有的antigratity包。

觉得这种手绘的漫话是不是有一种莫名的美感。Matplotlib就能画出这种风格的图表来!!当然不是那些小人什么的。

你需要做的就是在画图之前加上一行代码plt.xkcd(),比如画一个正弦曲线:

from numpy import linspace, sin
import matplotlib.pyplot as plt

plt.xkcd()
plt.plot(sin(linspace(0, 10)))
plt.title(‘Whoo Hoo!!!‘)

效果会是这样:

原本平整的图纸,像是被水浸泡过一样,变得扭曲。除此之外,它们还使用了,另外一种字体,叫做Humor Sans。

下面是干货时间到,如果你在标题里写入中文,你会发现中文的字体,还是你原来设置的,并没有配合图表进行改变,这也可以意料到,因为他们不可能为每一种文字找一种融洽的字体。

经过一番搜寻,发现方正卡通简体挺配的,于是安装到了系统里,却发现怎么也没法用这种字体。经过一番折腾发现,字体的名称只能是英文的,却不知道安装字体的英文名是什么,最后通过列出matplotlib所有支持的字体

sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])

反过来才找到,方正卡通简体正确的英文名字是FZKaTong-M19S。添加一行代码matplotlib.rc(‘font‘, **{‘family‘ : ‘FZKaTong-M19S‘})设置使用方正卡通简体就可以啦。

一切就绪,就等开画了,仍然是体育比赛的得分,这次是足球的

mean = sum(data)/len(data)
data_range = (min(data), max(data))

poisson = stats.poisson(mean)
x = range(data_range[0], data_range[1]+1)
poisson_distri = poisson.pmf(x)

plt.xkcd()
plt.hist(data, normed=True ,bins=max(data)+1, range=(-0.5,max(data)+0.5), color=‘green‘, label=‘实际分布‘)matplotlib.rc(‘font‘, **{‘family‘ : ‘FZKaTong-M19S‘})
plt.plot(poisson_distri, ‘o-‘, label=‘标准泊松分布‘)
plt.xlabel(‘一场比赛的进球数目‘)
plt.title(‘1998-2014年世界杯初赛进球数目的分布‘)
plt.legend()

足球比赛的得分,近似服从泊松分布

是不是很赞。除此之外,在xkcd模式下,箭头等其他的一些部件也有所改变

快去探索一番吧!Matplotlib还专门为xkcd模式准备了一个官网

时间: 2024-08-30 12:10:53

用matplotlib绘制漫画风格的图表的相关文章

matplotlib:使用matplotlib绘制图表

matplotlib下载及API手册地址:http://sourceforge.net/projects/matplotlib/files/matplotlib/ 数学库numpy下载及API手册地址:http://www.scipy.org/Download 几个绘图的例子[来自API手册] 1.最简单的图: 代码: #!/usr/bin/env python import matplotlib.pyplot as plt plt.plot([10, 20, 30]) plt.xlabel('

广义mandelbrot集,使用python的matplotlib绘制,支持放大缩小

迭代公式的指数,使用的1+5j,这是个复数,所以是广义mandelbrot集,大家可以自行修改指数,得到其他图形.各种库安装不全的,自行想办法,可以在这个网站找到几乎所有的python库 http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib #encoding=utf-8 import numpy as np import pylab as pl import time from matplotlib import cm from math

Python + Matplotlib 绘制 Penrose 铺砌

效果是不是很漂亮呢? 代码如下: #----------------------------------------- # Python + Matplotlib 绘制 Penrose 铺砌 # by Zhao Liang [email protected] #----------------------------------------- import matplotlib.pyplot as plt import numpy as np from matplotlib.path impor

用Matplotlib绘制二维图像

唠叨几句: 近期在做数据分析,需要对数据做可视化处理,也就是画图,一般是用Matlib来做,但Matlib安装文件太大,不太想直接用它,据说其代码运行效率也很低,在网上看到可以先用Java做数据处理,然后调用Matlib来画图,另外,还可以使用Matplotlib,它是用Python写的类似Matlib的库,能实现Matlib的功能,而且画图的质量很高,可用于做论文发表.找了一天的资料,终于出图了. Matplotlib需要配合numpy,scipy才能使用,具体安装步骤稍后补充. 正文: 用M

Python使用matplotlib绘制三维曲线

本文主要演示如何使用matplotlib绘制三维图形 代码如下: # -*- coding: UTF-8 -*- import matplotlib as mpl from mpl_toolkits.mplot3d import Axes3D import numpy as np import matplotlib.pyplot as plt # 设置图例字号 mpl.rcParams['legend.fontsize'] = 10 fig = plt.figure() # 设置三维图形模式 a

Python + Matplotlib 绘制 Aztec Diamond 图的随机铺砌

一个 $n$ 阶的 Aztec Diamond 图,是指依次将 $2,4,\ldots,2n,2n,\ldots,4,2$ 个单位方格摞在一起得到的对称图形(于是图中一共有 $2n(n+1)$ 个单位方格).下图是 $n=5$ 时候的例子: 对一个 $n$ 阶的 Aztec Diamond 图,用 $1\times 2$ 的多米诺骨牌铺砌它,总共有 $2^{n(n+1)}$ 种不同的方法.(这里不考虑对称性,比如全部用水平的骨牌铺砌和全部用竖直的骨牌铺砌,两种方法是不同的) 一个有趣的问题是,对

pyqt中使用matplotlib绘制动态曲线

一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟,每一秒钟绘制一个点,X轴长度超过1分钟,则左移1秒刻度,实现动态效果 2)Y轴显示随机变化的数值,1-100 三.准备工作 1环境:python3.3,eric5,pyqt4 四.开始动手: 使用Eric创建新项目: 在设计编码前期主要用到Eric的两个窗口:源码和窗体浏览器,类似delphi.

用matplotlib绘制每次交易的盈亏三角形

用matplotlib绘制每次交易的盈亏三角形 结果: 代码: python def plot_trade_triangle(self): # plot each trade as a trade-triangle, and annotate pnl trade = self.trade equity = self.equity.equity fig,ax=plt.subplots() for dt, row in trade.iterrows(): bars = row.buybar, row

python+matplotlib 绘制等高线

python+matplotlib 绘制等高线 步骤有七: 有一个m*n维的矩阵(data),其元素的值代表高度 构造两个向量:x(1*n)和y(1*m).这两个向量用来构造网格坐标矩阵(网格坐标矩阵m*n维,可见与data同) 构造网格坐标矩阵X,Y 进行颜色填充 画等高线 等高线的描述 删掉坐标系 1. 构造一下高度矩阵: def f(x,y): """ 计算高度的函数 :param x: 向量 :param y: 向量 :return: dim(x)*dim(y)维的矩