python——Matplotlib饼图、直方图的绘制

实验环境

python 3.6

matplotlib 2.2.3

饼图的绘制

matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False)

  • x:指定绘图的数据;

  • explode:指定饼图某些部分的突出显示,即呈现爆炸式;

  • labels:为饼图添加标签说明,类似于图例说明;

  • colors:指定饼图的填充色;

  • autopct:自动添加百分比显示,可以采用格式化的方法显示;

  • pctdistance:设置百分比标签与圆心的距离;

  • shadow:是否添加饼图的阴影效果;

  • labeldistance:设置各扇形标签(图例)与圆心的距离;

  • startangle:设置饼图的初始摆放角度;

  • radius:设置饼图的半径大小;

  • counterclock:是否让饼图按逆时针顺序呈现;

  • wedgeprops:设置饼图内外边界的属性,如边界线的粗细、颜色等;

  • textprops:设置饼图中文本的属性,如字体大小、颜色等;

  • center:指定饼图的中心点位置,默认为原点

  • frame:是否要显示饼图背后的图框,如果设置为True的话,需要同时控制图框x轴、y轴的范围和饼图的中心位置;

芝麻信用失信用户的分析

我们借用芝麻信用近300万失信人群的样本统计数据,该数据显示,从受教育水平上来看,中专占比25.15%,大专占比37.24%,本科占比33.36%,硕士占比3.68%,剩余的其他学历占比0.57%。

# 导入包
import matplotlib.pyplot as plt
# 设置绘图的主题风格
plt.style.use("ggplot")
# 构造数据
edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
labels = ["中专","大专","本科","硕士","其他"]

explode = [0,0.05,0,0,0] # 用于突出显示大专学历人群

colors = ['#9999ff','#ff9999','#7777aa','#2442aa','#dd5555'] # 自定义颜色

# 中文乱码和坐标轴负号处理
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = False
# 将横、纵坐标轴标准化处理,保证饼图是一个正圆,否则为椭圆
plt.axes(aspect = "equal")

# 控制x轴和y轴的范围
plt.xlim(0,10)
plt.ylim(0,10)

# 绘制饼图
plt.pie(x = edu,# 绘图数据
        explode=explode, #突出显示大专人群
        labels = labels,# 添加教育水标签
        colors = colors,# 设置饼图的自定义填充色
        autopct='%.1f%%',# 设置百分比格式,这里保留一位小数
        pctdistance = 0.8,# 设置百分比标签与圆心的距离
        labeldistance = 1.1,# 设置教育水平标签与圆心的距离,1.1指1.1倍半径的位置
        startangle = 180,# 设置饼图的初始角度
        radius = 3.3,# 设置饼图的半径
        counterclock = False,# 是否逆时针,这里设置为顺时针方向
        wedgeprops = {'linewidth': 0.1, 'edgecolor':'green'},# 设置饼图内外边界的属性值
        textprops = {'fontsize':12, 'color':'k'},# 设置文本标签的属性值
        center = (4,4),# 设置饼图的原点
        shadow = False, #在饼图下面画一个阴影。默认值:False,即不画阴影;
        frame = 1 )# 是否显示饼图的图框 ,这里设置显示
# 删除x轴和y轴的刻度        
plt.xticks(())
plt.yticks(())
plt.legend()
# 添加图标签
plt.title("芝麻信用失信用户教育水平分布")
plt.show()# 显示图形

python——Matplotlib饼图、直方图的绘制

直方图的绘制

matplotlib.pyplot.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False)

  • x:指定要绘制直方图的数据;

  • bins:指定直方图条形的个数;

  • range:指定直方图数据的上下界,默认包含绘图数据的最大值和最小值;

  • normed:是否将直方图的频数转换成频率;

  • weights:该参数可为每一个数据点设置权重;

  • cumulative:是否需要计算累计频数或频率;

  • bottom:可以为直方图的每个条形添加基准线,默认为0;

  • histtype:指定直方图的类型,默认为bar,除此还有’barstacked’, ‘step’, ‘stepfilled’;

  • align:设置条形边界值的对其方式,默认为mid,除此还有’left’和’right’;

  • orientation:设置直方图的摆放方向,默认为垂直方向;

  • rwidth:设置直方图条形宽度的百分比;

  • log:是否需要对绘图数据进行log变换;

  • color:设置直方图的填充色;

  • label:设置直方图的标签,可通过legend展示其图例;

  • stacked:当有多个数据时,是否需要将直方图呈堆叠摆放,默认水平摆放;

使用titanic数据集

一元直方图的绘制

# 导入第三方包
import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
# 中文和负号的正常显示
plt.rcParams["font.sans-serif"] = ["KaiTi"]
plt.rcParams["axes.unicode_minus"] = False
# 读取泰坦尼克数据集
titanic = pd.read_csv("train.csv")
# 检查年龄是否有缺失
age_isnull = any(titanic.Age.isnull())
print("年龄是否有缺失:",age_isnull)
# 删除年龄确实的样本
titanic.dropna(subset=["Age"],inplace=True) 
年龄是否有缺失: True
# 设置图形的显示风格
plt.style.use('ggplot')
# 绘图:乘客年龄的频数直方图
plt.hist(titanic.Age, # 绘图数据
        bins = 20, # 指定直方图的条形数为20个
        color = 'steelblue', # 指定填充色
        edgecolor = 'k', # 指定直方图的边界色
        label = '直方图' )# 为直方图呈现标签

# 去除图形顶部边界和右边界的刻度
plt.tick_params(top='off', right='off')
# 显示图例
plt.legend()
# 显示图形
plt.show()

python——Matplotlib饼图、直方图的绘制

上图绘制的是年龄的频数直方图,从整体的分布来看,有点像正态分布,两边低中间高的倒钟形状。

二元直方图的绘制

如果想对比男女乘客的年龄直方图的话,我们可以通过两个hist将不同性别的直方图绘制到一张图内

# 提取不同性别的年龄数据
age_female = titanic.Age[titanic.Sex == "female" ]
age_male = titanic.Age[titanic.Sex == "male" ]
# 设置直方图的组距
bins = np.arange(titanic.Age.min(),titanic.Age.max(),2)
# 男性乘客年龄的直方图
plt.hist(age_male,bins = bins,label = "男性",color = "blue",alpha = 0.5)
# 女性乘客年龄的直方图
plt.hist(age_female,bins = bins,label = "女性",color = "r",alpha = 0.8)

# 设置坐标轴标签和标题
plt.title("乘客年龄直方图")
plt.xlabel("年龄")
plt.ylabel("人数")

# 去除图形顶部边界和右部边界的刻度
plt.tick_params(top = "off",right = "off")
# 显示图例
plt.legend()
# 显示图形
plt.show()

python——Matplotlib饼图、直方图的绘制

图中结果反映不同年龄组内几乎都是男性乘客比女性乘客要多;同时,也说明男女性别的年龄组分布几乎一致

本文章主要作为学习历程的记录,如有侵权,请联系作者删除,原文地址https://www.kesci.com/home/project/59f6f21bc5f3f511952c2966