matplotlib 统计图的绘制

用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,这就是饼图的内容,之后还会带来更多统计学图的绘制!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值