Python数据分析与挖掘——使用Matplotlib绘制直方图

更新时间:2023-07-20 19:41:53 阅读: 评论:0

Python数据分析与挖掘——使⽤Matplotlib绘制直⽅图1. 使⽤hist绘制频数直⽅图
在Matplotlib中有⼀个专门绘制直⽅图的函数hist(),⽤来显⽰⼀组数据的分布情况。
使⽤hist()函数,⽆需对数据进⾏分拣整理,即可⾃动⽣成直⽅图。使⽤格式如下:
plt.hist(x, bins)
# 参数名基于官⽅⽂档声明
参数x:⽤于绘制直⽅图的⼀维数组,列表或者DataFrame的列向量形式。
参数bins:分两种情况:
(1)⼀个整数,按照数组的最⼩取值范围(即以数组的最⼩值和最⼤值作为区间的两端点)均匀分为若⼲组。
(2)数字列表,以列表的各个数字作为分组的边界点。
例如,随机⽣成⼀个含有1000个元素的服从标准正态分布的数组,绘制直⽅图,代码如下:
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt  # 导⼊图像库
plt.figure(figsize=(7,5))
data = np.random.randn(1000)    # 1000个服从标准正态分布的随机数
plt.hist(data, 10)      # 分成10组,结果如图1
plt.show()
# div = [-4, -3.5, -3, ..., 3, 3.5, 4]
div = []
x = -4
while x <= 4:
div.append(x)
x += 0.5
plt.hist(data, div)      # 指定分界点,结果如图2
plt.show()
得到的直⽅图如下:
图1
图2
2. 绘制频率直⽅图
Matplotlib中的hist()函数,实际上是在统计落在各区间的数据个数(相当于放置了若⼲个桶,把这些数据按照所落在的区间分别放进相应的桶内)并⽣成直⽅图,因此纵坐标是频数。
如果要绘制同样的直⽅图,但是要把纵坐标表⽰成频率或者频率与各组间距之⽐,需要先对数据进⾏分拣处理,然后以条形图(bar)形式输出结果。
以条形图的形式输出,有两种⽅式:
(1)直接⽤plt.bar()函数,使⽤格式:
plt.bar(x, height)
茶馆的读后感# 参数名基于官⽅⽂档声明
x为横坐标的标签,height为纵坐标的数值,⼆者均为列表或者DataFrame的列向量,且相同下标⼀⼀对应。
长江怎么画>先锋镇
(2)封装成DataFrame对象后使⽤内置⽅法plot(),并指定kind参数为“bar”。只能使⽤该DataFrame对象中指定的⼀列数据,并且要在封装对象时指定索引列,以索引列作为横坐标的标签。使⽤格式:
幻璃镜
df[col].plot(kind = "bar")
对于上⼀节的例⼦,采⽤plt.bar()函数绘制直⽅图的代码如下:
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt  # 导⼊图像库
plt.figure(figsize=(18,5))
data = np.random.randn(1000)    # 1000个服从正态分布的随机数
# div = [-4, -3.5, -3, ..., 3, 3.5, 4]
div = [-4]
x = []      # 横坐标,分组
y = []      # 纵坐标,频率,初始化为与分组同等数量的0
i = -3.5
j = 1
while i <= 4:
div.append(i)
x.append("["+str(div[j-1])+","+str(div[j])+")")
y.append(0)
i += 0.5
j += 1
有效沟通
# 分拣数据
莲藕花生for item in data:
的用英语怎么说
for i in range(0, len(div) - 1):
if item >= div[i] and item < div[i + 1]:
y[i] += 1
break
# 转换为频率
for i in range(len(y)):
y[i] = round(y[i] / 1000, 3) * 100      # 化为百分⽐
plt.bar(x, y)
plt.xlabel("分组")
plt.ylabel(r"频率/%")
plt.show()
如果封装成DataFrame对象,使⽤内置⽅法plot()并指定kind参数为“bar”,则上⾯代码的后四⾏应改为:
import pandas as pd
df = pd.DataFrame(y, index=x)
df.plot(kind="bar")
plt.xlabel("分组")
20年后的我
plt.ylabel(r"频率/%")
plt.show()
结果如图3:(此为采⽤第⼀种⽅法得到的结果,第⼆种⽅法得到的形状相同,只是横坐标的标签逆时针旋转90度)
图3
3. 绘制频率分布直⽅图(纵轴为频率/组距)
将上⼀节绘制直⽅图的代码“# 转换为频率”以下的部分改成下列代码,即可将纵轴设置为频率与各分组间距之⽐,即频率分布直⽅图:
# 转换为频率/组距
for i in range(len(y)):
y[i] = round(y[i] / 1000 / 0.5, 3)      # 频率/组距,保留三位⼩数
plt.bar(x, y)
plt.xlabel("分组")
plt.ylabel("频率/组距")
plt.show()
# 转换为频率/组距
for i in range(len(y)):
y[i] = round(y[i] / 1000 / 0.5, 3)      # 频率/组距,保留三位⼩数
df = pd.DataFrame(y, index=x)
df.plot(kind="bar")
plt.xlabel("分组")
plt.ylabel("频率/组距")
plt.show()
结果如图4:
图4

本文发布于:2023-07-20 19:41:53,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1089532.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:频率   数据   数组   指定   组距   区间
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图