柱状图直方图饼图数据来源(爬取豆瓣)
import requests
import openpyxl
# 利用openpyxl.Workbook()函数创建新的workbook(工作薄)对象,就是创建新的空的Excel文件。
wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = "热门电影信息"
sheet['A1'] = "电影名称"
sheet['B1'] = "链接"
sheet['C1'] = "评分"
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}
try:
for page in range(0, 5):
url_req = "https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=" + str(
page * 20)
req = requests.get(url=url_req, headers=header)
if req.status_code == 200:
json_req = req.json()
data_json = json_req['subjects']
pages = page + 1
print("*******************第%s页********************" % pages)
for data in data_json:
title = data['title']
url = data['url']
rate = data['rate']
print("数据写入中...", [title, url, rate])
sheet.append([title, url, rate])
print("*******************第%s页写入成功********************" % pages)
wb.save("douban_2021_03_06.xlsx")
wb.close()
else:
print("请求失败")
except Exception as error:
print(error)
import pandas as pd
data_all = pd.read_excel("./douban_2021_03_06.xlsx")
data_all.head()
柱状图-bar()
plt.bar(x,height,width,color)
- x:记录x轴上的标签
- height:记录每个柱形的高度
- width:设置柱形的宽度
- color:设置柱形的颜色,传入颜色值的列表,例如:[‘blue’,‘green’,‘red’],几个柱子几个值(自行测试)
%matplotlib inline
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 取出 5 条数据用来画 柱状图
data = data_all.head() # head() 默认获取前五条数据
X = data["电影名称"]
Y = data["评分"]
# 创建字体对象
my_font = font_manager.FontProperties(fname="D:/study/gameProjects/snake/SimHei.TTF", size=10)
# 绘制柱状图
plt.bar(X, Y, color=['red','green','blue','cyan','yellow','gray'])
plt.xticks(X, fontproperties=my_font)
plt.show()
标注
给柱状图的上方标识高度数值
plt.text(x,y,s,ha,va)
- 函数中前两个参数分别为标注数据的坐标,x和y坐标,
- 参数s记录标注的内容,
- 参数ha和va分别用于设置水平和垂直方向的对齐方式
# rects是 plt.bar()的返回值,里面包含了每一个柱形为每个柱形添加数值标注需要逐个添加
rects = plt.bar(X, Y, color=['red','green','blue','cyan','yellow','gray'])
plt.xticks(X, fontproperties=my_font) # 自定义x轴标注
plt.yticks(range(11)) # 自定义y轴标注
# 循环为每个柱子添加标注,(水平居中)
for rect in rects:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height+0.2, str(height),ha="center")
"""
通过
get_height() : 柱形图的高度
get_x() : 左侧边的x值
rect.get_width() : 柱子的宽度
rect.get_x() + rect.get_width() / 2 是为了获取柱子顶部的中点
使用plt.text添加上文字,这样就可以清晰地看出每个柱形的高度了
"""
plt.show()
直方图-hist()
plt.hist(data, bins, facecolor, edgecolor)
data
: 绘图用到的数据bins
: 控制直方图中的区间个数facecolor
: 矩形的填充颜色edgecolor
: 条形的边框颜色
# 使用爬取电影数据的评分数据, 分值 0-10 作为X轴刻度
data_all = pd.read_excel("./douban_2021_03_06.xlsx")
data = data_all["评分"]
# 2)创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 以 0.1的差距进行分组. 这就是柱距
distance = 0.1
# 计算组数
group_num = int((max(data) - min(data)) / distance)
# 绘制直方图
plt.hist(data, bins=group_num)
# 修改x轴刻度显示
# plt.xticks(range(11))
# plt.xticks([ i//10 for i in range(int(min(data))*10, int(max(data))*10)])
# 添加网格显示
plt.grid(linestyle="--", alpha=0.6)
# 添加x, y轴描述信息
plt.xlabel("电影评分",fontproperties=my_font)
plt.ylabel("电影数据量",fontproperties=my_font)
Text(0, 0.5, '电影数据量')
- 绘制直方图的重点在于设置组距, 然后分为若干组, 用矩形的高度表示每一组数据的频数
那么直方图和柱形图究竟有什么区别
第一,柱形图中用柱形的高度表示各类别的数值,横轴表示类别,宽度是固定的;而直方图是用矩形的高度表示每一组的频数或频率,宽度则表示各组的组距,因此其高度与宽度均有意义
第二,直方图主要用于展示连续型数值型数据,所以各矩形通常是连续排列的;而柱形图主要用于展示分类型数据,常常是分开排列的
饼图-pie()
饼图是展示 分类数据的占比情况,就是反映某个部分占整体的比重
饼图的整个圆代表总数据,各个扇形表示每项数据,我们可以根据扇形的角度清楚地看出每个扇形占总数据的比例
plt.pie(x, labels, autopct, shadow, startangle)
x
: 绘制用到的数据labels
: 用于设置饼图中每一个扇形外侧的显示说明文字autopct
: 设置饼图内百分比数据, 可以使用format字符串或者format function, 例如%.1f%%
值小数点后保留1位小数shadow
: 表示是否在饼图下面画阴影, 默认值False, 即不画阴影startangle
: 设置起始绘制角度, 默认图是从x轴正上方逆时针画起, 如果设定startangle=90, 则从Y轴正方向画起
data_all.head() # 初始数据
# 把数据评分数据进行分组
labels = ["六分以下", "分值[6,7)", "分值[7,8)", "分值[8,9)", "9分以上"]
sr_cut = pd.cut(data_all["评分"], [0, 6, 7, 8, 9, 10], right=False, labels=labels)
# 把分好组的数据添加到原数据中, 这样就多了一列数据, 好方便进一步分组
data_all["评分区间"] = sr_cut
data_all.head() # 新增一列后的原数据
# 对数据进行分组, 按照"评分区间"进行分组
num = data_all.groupby("评分区间").size()
# 得到的 num 为一个Series对象
# print(list(num))
# print(list(num.index))
plt.figure(figsize=(10, 8)) # 设置画布
# num.index 是Series对象的一个方法, 用来获取对象的索引
patches, l_text, p_text = plt.pie(num, labels = num.index, autopct='%.1f%%',shadow=False,startangle=90)
for t in l_text:
t.set_fontproperties(my_font)
plt.show()
plt.pie()
有三个返回值patches
: matplotlib.patches.Wedge列表(扇形实例)l_text
:label matplotlib.text.Text列表(标签实例)p_text
:label matplotlib.text.Text列表(百分比标签实例)- 在每一个扇形外侧显示中文的时候,需要获取到每一个标签实例,然后通过set_fontproperties()方法设置自定义字体
散点图-scatter()
plt.scatter(x, y, s, c, marker, alpha, linewidths)
x
,y
: 数组s
: 散点图中点的大小, 可选c
: 散点图中点的颜色, 可选marker
: 散点图的形状, 可选alpha
: 表示透明度, 在 0-1 取值, 可选linewidths
: 线条的粗细大小,值为数字, 就是会在散点图的点周围出现一个圆圈,值越大圈越大
%matplotlib inline
import pandas as pd
from matplotlib import pyplot as plt
df = pd.read_csv('./height_weight.csv')
df.head()
# 数据是身高与体重的数据
# 设置图形大小
plt.figure(figsize=(20,8),dpi=80)
# 使用scatter绘制散点图
plt.scatter(df['height'],df['weight'],alpha=0.5,s=100, c='red', linewidths=1)
plt.show()