数据可视化实战之链家

需求: 将之前爬取链家房源清理过的数据 做可视化分析 下面是之前写的博客

爬虫数据清洗可视化链家房源_数据清洗学习网站-CSDN博客

目的是熟练掌握pyecharts可视化 及pandas的运用

前提是安装了 pyecharts pip install pyecharts

柱状图

OK 读完题目的需求之后我们 需要查看数据集

打开Pycharm 通过pandas 读取文件 对文件有个大概的了解

像 shape head tail info 这些基本的函数 属性就不多说了 不会的可以看我之前的博客或者Ai

python 复制代码
# 导包 起别名
import pandas as pd
# * 就是导入所有 pyecharts 有大概20种图
from pyecharts.charts import *
# 导入配置项
from pyecharts import options as opts

# 这个是设置在终端可以查看到的数据长度 可以对比一下区别
# 正常情况下的文件列名有很多的话是查看不完全的
pd.set_option('display.max_columns', None)
pd.set_option('display.width', 1000)

df = pd.read_excel('cleaned_lianjia.xlsx')

# 这里就可以使用pandas中的cut函数对价格进行分类  就不用写冗长的if else判断语句了
# 这里bins也可以写数字 例如3 就是分成3段 但是具体的区间就不能控制
df['price_level'] = pd.cut(df['price'], bins=[0, 50, 100, 150, 200, 100000],
                           labels=['0-50万', '50-100万', '100-150万', '150-200万', '200万以上'])
# 使用value_counts()函数对价格进行分类统计 返回值默认按照从大到小排序
# 如果想从小到大排序的话  ascending=True 传入此参数即可
price_level_count = df['price_level'].value_counts()
# 统计每个价格区间的房源数量并显示百分比
# round(1) 保留1位小数
percent = (price_level_count / sum(price_level_count) * 100).round(1)
# 返回值是Series对象
print(percent)

现在数据有了 我们可以进行绘图了

python 复制代码
# 写法一 链式写法 推荐这种写法
bar = (
    # 实例化一个对象
    # init_opts 初始化配置
    # 设置图表初始化选项 宽度1200px、高度600px、页面标题为"房源价格区间分布" 就是 渲染器为SVG格式
    Bar(init_opts=opts.InitOpts(width='1200px', height='600px', page_title='房源价格区间分布', renderer='svg'))
    # 这里所需的数据类型为列表 获取Series的索引 将其转化为列表
    .add_xaxis(percent.index.tolist())
    # 获取Series 的值 返回的是array类型的 需要强转 
    # 索引里面有内置的方法 转化成列表
    .add_yaxis('价格区间', list(percent.values))
).render('bar.html')  # 渲染成html文件  可以通过浏览器打开查看
# 写法二 
bar = Bar()
bar.add_xaxis()
bar.add_yaxis()

由于Pyecharts参数很多 配置项也很多 在官网有Api文档可以观看 中文简介 - Document

pyecharts 全局配置项_w3cschool 这个网站Api会更加完善一些 适合有一些基础的看

推荐大家看这个 需要用什么效果就去官网搜索 然后复制修改即可

运行此文件 查看效果

这是什么都不加的效果图 会比matplotlib精致 好看很多

接下来 是个示例 主要是向大家了解一下这些经常用到的配置项 这样对照着学习 看 会快一些

这些配置项很多 但是略懂些英语就不是很难 掌握规律 多敲即可

python 复制代码
from pyecharts.charts import Bar
from pyecharts import options as opts

bar = (
    # 创建柱形图实例
    Bar(init_opts=opts.InitOpts(
        width="900px",
        height="500px",  # 设置 图表宽高
        theme="white",    # 'light' 'dark' 'white' 或内置主题
        # 动画配置 持续时间1000ms 缓动效果为cubicOut(平滑淡出)
        animation_opts=opts.AnimationOpts(duration=1000, easing="cubicOut")
    ))
    .add_xaxis(["A", "B", "C"])  # X轴分类数据
    .add_yaxis("系列1", [10, 20, 30], # Y轴系列数据
               label_opts=opts.LabelOpts(is_show=True, position="top"), # 显示顶部标签
               color="auto",  # ECharts 系列级别颜色
               stack=None,    # 不适用堆叠效果
               category_gap="30%") # 分类间距30%
    .set_global_opts(
        title_opts=opts.TitleOpts(title="示例", subtitle="副标题"),  # 标题和副标题
        toolbox_opts=opts.ToolboxOpts(is_show=True), # 显示工具箱(下载、保存等)
        legend_opts=opts.LegendOpts(is_show=True), # 显示图例
        tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="shadow"),  # 提示框配置
        xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=True),  # X轴为分类轴 有边界留白
        yaxis_opts=opts.AxisOpts(type_="value", min_=0), # Y轴为数值轴,最小值0
        datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")]  # 数据缩放控件
    )
    .set_series_opts(
        markpoint_opts=opts.MarkPointOpts( # 标记点配置
            data=[opts.MarkPointItem(type_="max"), opts.MarkPointItem(type_="min")] # 显示最大值和最小值
        ),
        markline_opts=opts.MarkLineOpts( # 标记线配置
            data=[opts.MarkLineItem(type_="average")] # 显示平均值线
        )
    )
)
# 渲染到 HTML
bar.render("bar.html")
# 或在 notebook 中显示
bar.render_notebook()

以下是实现上图效果的 代码

python 复制代码
bar = (
    Bar(init_opts=opts.InitOpts(width='1200px', height='600px', page_title='房源价格区间分布', renderer='svg'))
    .add_xaxis(percent.index.tolist())
    .add_yaxis('价格区间', list(percent.values),
               # 这个label_opts就是在柱状图上显示数据的配置项 是否显示 数据的位置 数据的字体大小等 都可以设置
               label_opts=opts.LabelOpts(is_show=True, position='top', font_weight='bold', font_size=12))
    # 添加全局配置项
    .set_global_opts(
        # 标题配置 副标题配置 后面是对标题以及副标题文字修改调整的配置项 调整大小 颜色 粗细
        title_opts=opts.TitleOpts(title='长沙链家二手房价格分布', subtitle='价格区间',
                                  title_textstyle_opts=opts.TextStyleOpts(font_weight='bold', font_size=25),
                                  subtitle_textstyle_opts=opts.TextStyleOpts(font_size='17', font_weight='bold')),
        toolbox_opts=opts.ToolboxOpts(is_show=True),
        visualmap_opts=opts.VisualMapOpts(is_show=True),  # 添加视觉映射配置项 就是那个颜色区域 对应价格区间
        datazoom_opts=opts.DataZoomOpts(is_show=True, type_='inside'),  # 设置成inside 鼠标放在图片中滑动滚轮即可缩放 也可以设置成slider 需要拖动图标
        legend_opts=opts.LegendOpts(is_show=True),
        tooltip_opts=opts.TooltipOpts(trigger='axis', axis_pointer_type='shadow'),
        xaxis_opts=opts.AxisOpts(type_='category', name='价格区间',
                                 axislabel_opts=opts.LabelOpts(text_width=20, font_size=14, font_weight='bold'),
                                 name_textstyle_opts=opts.TextStyleOpts(font_size=16, font_weight='bold')),
        # 设置x轴的配置项 字体大小 粗细 因为我觉得原始的样子不是很明显需要调整一下
        yaxis_opts=opts.AxisOpts(type_='value', min_=0, name='房源数量',
                                 name_textstyle_opts=opts.TextStyleOpts(font_size=16, font_weight='bold'),
                                 axislabel_opts=opts.LabelOpts(text_width=20, font_size=14, font_weight='bold')),
        # y轴也是
    )
    # 添加系列配置项
    .set_series_opts(
        # 添加标记点 可以标记最小值 最大值 平均值 这里标记最小值 美观一些  折线图会更加适用
        markpoint_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='min')]),
        # 添加标记线 可以标记平均值,最大值,最小值 这里标记的是数据中的平均值
        markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='average')]),
    )

).render('bar.html')

最终的效果图如下显示 这样的话会比较美观 具有观赏性

到此 第一个题目就做完了


饼图

python 复制代码
import pandas as pd
from pyecharts.charts import Pie
from pyecharts import options as opts

pd.set_option('display.max_columns', None)
pd.set_option('display.width', 1000)

df = pd.read_excel('cleaned_lianjia.xlsx')

# 提取各户型的房源数量  以室分割 取分割后的一个元素 后面加个室 会更好 
df['room_number'] = df['rooms'].str.split('室').str[0]+'室'
numbers = df['room_number'].value_counts() 

data = [(i, int(j)) for i, j in zip(numbers.index, list(numbers.values))]

# 特别注意这里 饼图传入的参数是序列化对象 一般是 列表套元组 或者列表套列表的形式 参数都是python中的数据类型 int64 str等

# 但是 numbers.values 获取的是Series对象中的值 而形成的列表 每个值都是 ndarray.int64 类型的 此时需要强转成python中的int类型 否则就生成不了图表

python 复制代码
pie = (
    Pie(init_opts=opts.InitOpts(width='1200px', height='600px', page_title='房型分布', renderer='svg'))
    # 添加数据 center 就是这个饼图在画布中的百分比位置 左右 上下   radius 内外半径分别为画布的45%和75%,形成环形效果 玫瑰图的类型
    .add('各户型统计', data_pair=data, center=['30%', '50%'], radius=['45%', '75%'], rosetype='radius',
         label_opts=opts.LabelOpts(is_show=True, font_size=12, font_weight='bold', position='outside',
                                   formatter='{b}:{c}({d}%)'))  # 标签格式:{b}=分类名, {c}=数值, {d}=百分比
    .set_global_opts(
        title_opts=opts.TitleOpts(title='房型分布', subtitle='室的数量'),
        # 将颜色区域 水平放置在左下角 会比较美观些
        visualmap_opts=opts.VisualMapOpts(is_show=True, pos_left='left', orient='horizontal', pos_bottom='bottom'),
        # 添加工具栏  将工具栏垂直放置靠近左边的图形
        toolbox_opts=opts.ToolboxOpts(is_show=True, pos_left='800px', pos_top='30px', orient='vertical'),
    )
).render('pie.html')

效果图


本次的案例分析就到此结束啦 谢谢大家的观看 你的点赞和关注是我更新的最大动力
如果感兴趣的话可以看看我之前的博客 我也会继续学习

相关推荐
小裴(碎碎念版)2 小时前
文件读写常用操作
开发语言·爬虫·python
TextIn智能文档云平台2 小时前
图片转文字后怎么输入大模型处理
前端·人工智能·python
ujainu2 小时前
Python学习第一天:保留字和标识符
python·学习·标识符·保留字
studytosky2 小时前
深度学习理论与实战:反向传播、参数初始化与优化算法全解析
人工智能·python·深度学习·算法·分类·matplotlib
清水白石0083 小时前
《Python × 数据库:用 SQLAlchemy 解锁高效 ORM 编程的艺术》
开发语言·python·json
星依网络3 小时前
使用LabelImg工具标注数据(游戏辅助脚本开发)
python·游戏引擎·图形渲染·骨骼绑定
站大爷IP3 小时前
Appium实现Android应用数据爬取:从环境搭建到实战优化
python
IT老兵20254 小时前
PyTorch DDP多GPU训练实践问题总结
人工智能·pytorch·python·分布式训练·ddp
9527(●—●)4 小时前
windows系统python开发pip命令使用(菜鸟学习)
开发语言·windows·python·学习·pip