调用 Matplotlib 的 barh() 函数可以生成水平柱状图。
plt.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)
countries = ['挪威', '德国', '中国', '美国', '瑞典']
# 金牌个数
gold_medal = np.array([16, 12, 9, 8, 8])
# y轴为国家,宽度为奖牌数
plt.barh(countries, width=gold_medal)
三天中3部电影的票房变化
movie = ['新蝙蝠侠', '狙击手', '奇迹笨小孩']
real_day1 = [4053, 2548, 1543]
real_day2 = [7840, 4013, 2421]
real_day3 = [8080, 3673, 1342]
分析:
分析:
# 由于牵扯计算,因此将数据转numpy数组
movie = ['新蝙蝠侠', '狙击手', '奇迹笨小孩']
# 第一天
real_day1 = np.array( [4053, 2548, 1543])
# 第二天
real_day2 = np.array([7840, 4013, 2421])
# 第三天
real_day3 = np.array([8080, 3673, 1342])
# =================1.y轴转换为数值型======
num_y = np.arange(len(movie))
# ================2.需要设置同图形的高度========
height = 0.2
# ================3.计算每个图形高度的起始位置 ==========
movie1_start_y = num_y # 第一个电影不变
movie2_start_y = num_y + height # 第二个电影加上1倍的height
movie3_start_y = num_y + 2 * height # 第三个电影加上2倍的height
# ================4.绘制图形 ===================
plt.barh(movie1_start_y, real_day1, height=height) # 第一天图形
plt.barh(movie2_start_y, real_day2, height=height) # 第二天图形
plt.barh(movie3_start_y, real_day3, height=height) # 第三天图形
# 设置数值文本: 计算宽度值和y轴为值
# ============5.替换y轴数据
plt.yticks(num_y + height, movie)
for i in range(len(movie)):
plt.text(real_day1[i], movie1_start_y[i], real_day1[i], va="center", ha="left")
plt.text(real_day2[i], movie2_start_y[i], real_day2[i], va="center", ha="left")
plt.text(real_day3[i], movie3_start_y[i], real_day3[i], va="center", ha="left")
plt.xlim(0, 9000)
直方图(Histogram),又称质量分布图,它是一种条形图的一种,由一系列高度不等的纵向线段来表示数据分布的情况。 直方图的横轴表示数据类型,纵轴表示分布情况。
首先,我们需要了解柱状图和直方图的区别。直方图用于概率分布,它显示了一组数值序列在给定的数值范围内出现的概率;而柱状图则用于展示各个类别的频数。
柱状图 | 直方图 |
---|---|
柱状图一般用于描述离散型分类数据的对比 | 直方图一般用于描述连续型数据的分布关系 |
每根柱子宽度固定,柱子之间会有间距 | 每根柱子宽度可以不一样,且一般没有间距 |
横轴变量可以任意排序 | 横轴变量有一定顺序规则 |
将统计值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。 直方图也可以被归一化以显示“相对”频率。 然后,它显示了属于几个类别中的每个类别的占比,其高度总和等于1。
plt.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None, *, data=None, **kwargs)
# 使用numpy随机生成300个随机数据
x_value = np.random.randint(140,180,300)
plt.hist(x_value, bins=10, edgecolor='white')
#plt.hist(x_value, bins=20, edgecolor='white')
plt.title("数据统计")
plt.xlabel("身高")
plt.ylabel("比率")
返回值
num,bins_limit,patches = plt.hist(x_value, bins=10, edgecolor='white')
plt.grid(ls="--")
num
array([26., 39., 40., 32., 29., 31., 24., 27., 26., 26.])
bins_limit
array([140. , 143.9, 147.8, 151.7, 155.6, 159.5, 163.4, 167.3, 171.2, 175.1, 179. ])
for i in patches:
print(i)
print(i.get_x())
print(i.get_y())
print(i.get_height())
print(i.get_width())
Rectangle(xy=(140, 0), width=3.9, height=26, angle=0) # i其中之一
在直方图中,我们也可以加一个折线图,辅助我们查看数据变化情况
首先通过pyplot.subplots()创建Axes对象
通过Axes对象调用hist()方法绘制直方图,返回折线图所需要的下x,y数据
然后Axes对象调用plot()绘制折线图
我们对第一节代码进行改造一下
# 创建一个画布
fig, ax = plt.subplots()
# 绘制直方图
num,bins_limit,patches = ax.hist(x_value, bins=10, edgecolor='white')
# 注意num返回的个数是10,bins_limit返回的个数为11,需要截取
print(bins_limit[:-1])
# 曲线图
ax.plot(bins_limit[:10], num, '--',marker="o")
#ax.set_xticks(bins_limit)
# 需要单独设置x轴的旋转
plt.xticks(bins_limit,rotation=45)
上面的直方图都是等距的,但有时我们需要得到不等距的直方图,这个时候只需要确定分组上下限,并指定 histtype="bar" 就可
fig, ax = plt.subplots()
x = np.random.normal(100,20,100) # 均值和标准差
bins = [50, 60, 70, 90, 100,110, 130, 140]
ax.hist(x, bins, color="g",edgecolor="white",histtype="bar")
ax.set_title('不等距分组')
plt.show()
我们在使用直方图查查看数据的频率时,有时候会查看多种类型数据出现的频率。
# 指定分组个数
n_bins=10
fig,ax=plt.subplots(figsize=(8,5))
# 分别生成10000 , 5000 , 2000 个值 列表套列表
x_multi = [np.random.randn(n) for n in [10000, 5000, 2000]]
# 实际绘图代码与单类型直方图差异不大,只是增加了一个图例项
# 在 ax.hist 函数中先指定图例 label 名称
ax.hist(x_multi, n_bins, histtype='bar',label=list("ABC"))
ax.set_title('多类型直方图')
# 通过 ax.legend 函数来添加图例
ax.legend()
我们有时候会把同样数据范围情况下,对比两组不同对象群体收集的数据差异
准备两组数据:
x_value = np.random.randint(140,180,200)
x2_value = np.random.randint(140,180,200)
直方图属性data:以列表的形式传入两组数据
设置直方图stacked:为True,允许数据覆盖
plt.hist([x_value,x2_value],bins=10, stacked=True)
饼状图用来显示一个数据系列,具体来说,饼状图显示一个数据系列中各项目的占项目总和的百分比。
Matplotlib 提供了一个 pie() 函数,该函数可以生成数组中数据的饼状图。您可使用 x/sum(x) 来计算各个扇形区域占饼图总和的百分比。pie() 函数的参数说明如下:
pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None)
# 设置大小
plt.rcParams['figure.figsize'] = (5,5)
#定义饼的标签,
labels = ['娱乐','育儿','饮食','房贷','交通','其它']
#每个标签所占的数量
x = [200,500,1200,7000,200,900]
#绘制饼图
plt.pie(x,labels=labels)
autopct
#定义饼的标签,
labels = ['娱乐','育儿','饮食','房贷','交通','其它']
#每个标签所占的数量
x = [200,500,1200,7000,200,900]
plt.title("饼图示例-8月份家庭支出")
#%.2f%%显示百分比,保留2位小数
plt.pie(x,labels=labels,autopct='%.2f%%')
explode: 指定饼图某些部分的突出显示
#定义饼的标签,
labels = ['娱乐','育儿','饮食','房贷','交通','其它']
#每个标签所占的数量
x = [200,500,1200,7000,200,900]
#饼图分离
explode = (0.03,0.05,0.06,0.04,0.08,0.21)
#设置阴影效果
plt.pie(x,labels=labels,autopct='%3.2f%%',explode=explode)
#定义饼的标签,
labels = ['娱乐','育儿','饮食','房贷','交通','其它']
#每个标签所占的数量
x = [200,500,1200,7000,200,900]
#饼图分离
explode = (0.03,0.05,0.06,0.04,0.08,0.1)
#设置阴影效果
#plt.pie(x,labels=labels,autopct='%3.2f%%',explode=explode,shadow=True)
plt.pie(x,labels=labels,autopct='%3.2f%%',explode=explode, labeldistance=1.35, pctdistance=1.2)
设置x,y的刻度一样,使其饼图为正圆
plt.axis('equal')