用matplotlib来绘制一些统计图,如饼图、直方图,有时候会达到很出色的视觉效果,这篇博文就介绍几种统计图的画法。
转载请注明出处。
对于一个学习者,当我们想画一张图的时候,首先去matplotlib的画廊中找到和自己预期相近的。然后在别人的源代码上修改,达到自己的目的。
下面就用这种思路画一张图。
月份数据图
为了画一张饼图,我在一个小型画廊中,找到一张图:
这张图看起来很精美了,但是有几个地方是我想修改的:
1、我想要一张大一点的图,
2、这里的数据是随机生成的,我想要自定义数据生成
为了达成这两个小目标,我在原图的基础上,修改了代码,完成之后看起来是这样:
这张图有如下特点:
1、图片变大了
2、数据大小是随月份逐渐增大再减小的,
3、在数据上标注了大小
这些小修改是怎么做到的呢,下面贴出代码,你可以通过看注释找到修改的方法。
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
# Data to be represented
# ----------
labels = ['January', 'Feburary', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December']
n = len(labels)
#data = np.random.uniform(0,1,n)
data = np.array([0,0.1,0.2,0.3,0.4,0.5,0.6,0.5,0.4,0.3,0.2,0.1,])
#修改了原代码的数据生成方式,从随机生成,到自己指定
# ----------
# Make figure square and background the same colors as axes (white)
#fig = plt.figure(figsize=(8,6), facecolor='white')
#修改了图片大小
fig = plt.figure(figsize=(16,12), facecolor='white')
# Make a new polar axis
axes = plt.subplot(111, polar=True, axisbelow=True)
# Put labels on outer
# 从这里可以看到极坐标的定位方式:是角度加长度进行定位的,角度总和即2*pi
T = np.arange(np.pi/n, 2*np.pi, 2*np.pi/n)
R = np.ones(n)*10
width = 2*np.pi/n
#这里定义了月份标签的显示位置,这里是离极点距离为9的位置
# Label background
bars = axes.bar(T, R, width=width, bottom=9,
linewidth = 2, facecolor = '0.9', edgecolor='1.00')
# Labels
# 下面定义了文字的位置,包括月份,和data的标识文字
for i in range(T.size):
theta = T[n-1-i] + np.pi/2
plt.text(theta, 9.5, labels[i], rotation=180*theta/np.pi-90,
family='Helvetica Neue', size=7,
horizontalalignment="center", verticalalignment="center")
R = 1 + data*6
plt.text(theta, R[i]+R[i]*0.1+ 1.2 if R[i] < 3 else R[i]+R[i]*0.1, data[i], rotation=180*theta/np.pi-90,
family='Helvetica Neue', size=18,color = 'blue',
horizontalalignment="center", verticalalignment="center")
# Data
R = 1 + data*9
bars = axes.bar(T, R, width=width, bottom=2,
linewidth=1, facecolor = '0.75', edgecolor='1.00')
for i,bar in enumerate(bars):
bar.set_facecolor(plt.cm.hot(R[i]/10))
#这里重新设置了data数据块的位置,以保证和月份的位置相一致
bar.set_x(T[n-1-i] + np.pi/2 - np.pi/n)
# Text i the center
plt.text(1*np.pi/2, 0.05, "2017",
size=16, family='Helvetica Neue Light',
horizontalalignment="center", verticalalignment="bottom")
plt.text(3*np.pi/2, 0.05, "some levels",color="0.50",
size=8, family='Helvetica Neue Light',
horizontalalignment="center", verticalalignment="top")
# Set ticks, tick labels and grid
plt.ylim(0,10)
plt.xticks(T)
plt.yticks(np.arange(2,9))
axes.grid(which='major', axis='y', linestyle='-', color='0.75')
axes.grid(which='major', axis='x', linestyle='-', color='1.00')
for theta in T:
axes.plot([theta,theta], [4,9], color='w', zorder=2, lw=1)
axes.set_xticklabels([])
axes.set_yticklabels([])
plt.show()
从代码中,我们还可以有如下理解:
1、对于饼图来说,数据块大多由bar来画,通过适当的设置width和bottom来啊达到想要的效果
2、通过设置坐标轴的颜色和背景色一样,来达到类似透明的效果
3、通过对字体旋转角度的控制,来达到字体和数据块的对齐
OK,这就是饼图的内容,之后还会带来更多统计学图的绘制!