数据可视化Matplotlib使用3-常见图像绘制

柱状图直方图饼图数据来源(爬取豆瓣)

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()

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值