实验环境
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()# 显示图形
直方图的绘制
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()
上图绘制的是年龄的频数直方图,从整体的分布来看,有点像正态分布,两边低中间高的倒钟形状。
二元直方图的绘制
如果想对比男女乘客的年龄直方图的话,我们可以通过两个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()
图中结果反映不同年龄组内几乎都是男性乘客比女性乘客要多;同时,也说明男女性别的年龄组分布几乎一致
本文章主要作为学习历程的记录,如有侵权,请联系作者删除,原文地址https://www.kesci.com/home/project/59f6f21bc5f3f511952c2966