目录
一、前言
今天,我们来可视化大屏链家的二手房源信息,因为网上的数据不够直观,准确,所以我们要对数据进行有效的挖掘,然后让数据能够一目了然,如果你们没有数据,可以点击这个链接,里面有数据采集文件,所以我们选择做可视化大屏,效果如下图
二、代码实现过程
1、导包
# coding=utf-8
import pyecharts.options as opts
import pandas as pd
import pymysql
import warnings
from pyecharts.charts import Bar,Pie,WordCloud,Liquid,Page
from pyecharts.globals import ThemeType
2、创建类
class Lianjia_anylize(object):
def __init__(self):
warnings.filterwarnings('ignore') # 忽略警告
self.con=pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='lianjia',charset='utf8') # 创建与MySQl的链接
self.data=pd.read_sql('select * from house',self.con) # 读取数据
3、查看数据概况
def info_data(self):
print(self.data) # 查看数据
print(self.data.info()) # 查看数据类型
print(self.data.describe()) # 查看数据描述
4、画柱状图一
def bar1(self):
data2 = self.data[['total_price', 'price']].astype(float) # 转换数据类型
data2['address']=self.data[['address']]
data3 = data2[['address','total_price', 'price']].nlargest(10,['total_price','price']) # 查找总价和单价价格前10的小区
bar1 = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION, chart_id=1)) # 定义主题风格
.add_xaxis(data3.index.tolist()) # 添加x轴
.add_yaxis('总价(万)', data3['total_price'].tolist(), itemstyle_opts=opts.ItemStyleOpts(color='#FAFAD2')) # 添加y轴
.set_global_opts(
title_opts=opts.TitleOpts(title='房子总价前10的小区'), # 设置标题
datazoom_opts=[opts.DataZoomOpts(is_show=True), opts.DataZoomOpts(type_='inside')], # 设置区域缩放条
toolbox_opts=opts.ToolboxOpts(is_show=True) # 设置工具箱
)
)
bar1.render('house1.html') # 展示柱状图
return bar1
5、画柱状图二
def bar2(self):
data2 = self.data[['total_price', 'price']].astype(float) # 转换数据类型
data2['address']=self.data[['address']]
data3 = data2[['address','total_price', 'price']].nlargest(10,['total_price','price']) # 查找总价和单价价格前10的小区
bar2 = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION, chart_id=2)) # 定义主题风格
.add_xaxis(data3.index.tolist()) # 添加x轴
.add_yaxis('元/平方米', data3['price'].tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='房子单价前10小区'), # 设置标题
datazoom_opts=[opts.DataZoomOpts(is_show=True), opts.DataZoomOpts(type_='inside')], # 设置区域缩放条
toolbox_opts=opts.ToolboxOpts(is_show=True) # 设置工具箱
)
)
bar2.render('house2.html') # 展示柱状图二
return bar2
6、画饼图
def pie(self):
data3 = self.data[['decoration']].value_counts() # 查看售卖房源的装修程度
pie = (
Pie(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION, chart_id=3)) # 定义主题风格
.add('装修程度', [list(z) for z in zip(data3.index.tolist(), data3.values.tolist())], center=["35%", "50%"]) # 将数据转化为列表并添加
.set_global_opts(title_opts=opts.TitleOpts(title='出售房屋的总体装修程度'), # 设置标题
legend_opts=opts.LegendOpts(pos_left="15%")) # 设置图例位置
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) # 设置提示框内容
)
pie.render('house3.html') # 展示饼图
return pie
7、 画词云图一
def wordcloud1(self):
data4 = self.data[['address']].value_counts() # 查看售卖房屋频率较高的小区
wordcloud1 = (
WordCloud(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION, chart_id=4)) # 定义主题风格
.add('出售房屋数量', [list(z) for z in zip(data4.index.tolist(), data4.values.tolist())], word_size_range=[6, 66]) # 将数据转换为列表并添加数据,定义词云图的大小
.set_global_opts(title_opts=opts.TitleOpts(title='出售房屋数量的各小区'), # 设置标题
tooltip_opts=opts.TooltipOpts(is_show=True))
)
wordcloud1.render('house4.html') # 展示词云图一
return wordcloud1
8、画词云图二
def wordcloud2(self):
data6 = self.data[['type_']].value_counts() # 查看售卖房屋类型的小区
print(data6)
wordcloud2 = (
WordCloud(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION, chart_id=5)) # 定义主题风格
.add('出售房屋类型的数量', [list(z) for z in zip(data6.index.tolist(), data6.values.tolist())], # 将数据转换为列表并加载数据
word_size_range=[10, 100])
.set_global_opts(title_opts=opts.TitleOpts(title='出售房屋类型的数量'), # 设置标题
tooltip_opts=opts.TooltipOpts(is_show=True))
)
wordcloud2.render('house5.html') # 展示词云图二
return wordcloud2
9、画水球图
def liquid(self):
data5 = self.data[['total_price']].astype(float).mean()*0.01 # 转换数据类型,查看售卖房源的平均总价
print(data5)
liquid = (
Liquid(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION, chart_id=6)) # 定义主题风格
.add('平均价格/万', [data5.tolist(), 0]) # 加载数据
)
liquid.render('house6.html') # 展示水球图
return liquid
10、画可视化大屏
一定要先设置功能图的位置,然后点击左上角的Save config进行下载功能图的位置文件,然后将文件的路径添加到cfg_file这个参数里面,如果你比较懒,可以点击这个链接,里面有我设置好的位置文件
def page(self):
page = (
Page(layout=Page.DraggablePageLayout) # 设置自定义位置格式
.add(
self.bar1(), # 添加以上的功能图
self.bar2(),
self.pie(),
self.wordcloud1(),
self.wordcloud2(),
self.liquid()
)
.render()
)
Page.save_resize_html('render.html',
cfg_file='./chart_config2.json', # 加载你设置的各图的位置文件
dest='house.html') # 展示可视化大屏
11、运行主函数
def main(self):
self.info_data() # 运行数据概况函数
self.page() # 运行可视化大屏函数
12、创建实例对象
if __name__ == '__main__':
lianjia = Lianjia_anylize() # 创建实例对象
lianjia.main() # 运行主函数
三、以下是完整代码
# coding=utf-8
import pyecharts.options as opts
import pandas as pd
import pymysql
import warnings
from pyecharts.charts import Bar, Pie, WordCloud, Liquid, Page
from pyecharts.globals import ThemeType
class Lianjia_anylize(object):
def __init__(self):
warnings.filterwarnings('ignore') # 忽略警告
self.con = pymysql.connect(host='localhost', port=3306, user='root', password='123456', database='lianjia',
charset='utf8') # 创建与MySQl的链接
self.data = pd.read_sql('select * from house', self.con) # 读取数据
def info_data(self):
print(self.data) # 查看数据
print(self.data.info()) # 查看数据类型
print(self.data.describe()) # 查看数据描述
def bar1(self):
data2 = self.data[['total_price', 'price']].astype(float) # 转换数据类型
data2['address'] = self.data[['address']]
data3 = data2[['address', 'total_price', 'price']].nlargest(10, ['total_price', 'price']) # 查找总价和单价价格前10的小区
bar1 = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION, chart_id=1)) # 定义主题风格
.add_xaxis(data3.index.tolist()) # 添加x轴
.add_yaxis('总价(万)', data3['total_price'].tolist(),
itemstyle_opts=opts.ItemStyleOpts(color='#FAFAD2')) # 添加y轴
.set_global_opts(
title_opts=opts.TitleOpts(title='房子总价前10的小区'), # 设置标题
datazoom_opts=[opts.DataZoomOpts(is_show=True), opts.DataZoomOpts(type_='inside')], # 设置区域缩放条
toolbox_opts=opts.ToolboxOpts(is_show=True) # 设置工具箱
)
)
bar1.render('house1.html') # 展示柱状图一
return bar1
def bar2(self):
data2 = self.data[['total_price', 'price']].astype(float) # 转换数据类型
data2['address'] = self.data[['address']]
data3 = data2[['address', 'total_price', 'price']].nlargest(10, ['total_price', 'price']) # 查找总价和单价价格前10的小区
bar2 = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION, chart_id=2)) # 定义主题风格
.add_xaxis(data3.index.tolist()) # 添加x轴
.add_yaxis('元/平方米', data3['price'].tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='房子单价前10小区'), # 设置标题
datazoom_opts=[opts.DataZoomOpts(is_show=True), opts.DataZoomOpts(type_='inside')], # 设置区域缩放条
toolbox_opts=opts.ToolboxOpts(is_show=True) # 设置工具箱
)
)
bar2.render('house2.html') # 展示柱状图二
return bar2
def pie(self):
data3 = self.data[['decoration']].value_counts() # 查看售卖房源的装修程度
pie = (
Pie(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION, chart_id=3)) # 定义主题风格
.add('装修程度', [list(z) for z in zip(data3.index.tolist(), data3.values.tolist())],
center=["35%", "50%"]) # 将数据转化为列表并添加
.set_global_opts(title_opts=opts.TitleOpts(title='出售房屋的总体装修程度'), # 设置标题
legend_opts=opts.LegendOpts(pos_left="15%")) # 设置图例位置
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) # 设置提示框内容
)
pie.render('house3.html') # 展示饼图
return pie
def wordcloud1(self):
data4 = self.data[['address']].value_counts() # 查看售卖房屋频率较高的小区
wordcloud1 = (
WordCloud(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION, chart_id=4)) # 定义主题风格
.add('出售房屋数量', [list(z) for z in zip(data4.index.tolist(), data4.values.tolist())],
word_size_range=[6, 66]) # 将数据转换为列表并添加数据,定义词云图的大小
.set_global_opts(title_opts=opts.TitleOpts(title='出售房屋数量的各小区'), # 设置标题
tooltip_opts=opts.TooltipOpts(is_show=True))
)
wordcloud1.render('house4.html') # 展示词云图一
return wordcloud1
def wordcloud2(self):
data6 = self.data[['type_']].value_counts() # 查看售卖房屋类型的小区
print(data6)
wordcloud2 = (
WordCloud(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION, chart_id=5)) # 定义主题风格
.add('出售房屋类型的数量', [list(z) for z in zip(data6.index.tolist(), data6.values.tolist())], # 将数据转换为列表并加载数据
word_size_range=[10, 100])
.set_global_opts(title_opts=opts.TitleOpts(title='出售房屋类型的数量'), # 设置标题
tooltip_opts=opts.TooltipOpts(is_show=True))
)
wordcloud2.render('house5.html') # 展示词云图二
return wordcloud2
def liquid(self):
data5 = self.data[['total_price']].astype(float).mean() * 0.01 # 转换数据类型,查看售卖房源的平均总价
print(data5)
liquid = (
Liquid(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION, chart_id=6)) # 定义主题风格
.add('平均价格/万', [data5.tolist(), 0]) # 加载数据
)
liquid.render('house6.html') # 展示水球图
return liquid
def page(self):
page = (
Page(layout=Page.DraggablePageLayout) # 设置自定义位置格式
.add(
self.bar1(), # 添加以上的功能图
self.bar2(),
self.pie(),
self.wordcloud1(),
self.wordcloud2(),
self.liquid()
)
.render()
)
Page.save_resize_html('render.html',
cfg_file='./chart_config2.json', # 加载你设置的各图的位置文件
dest='house.html') # 展示可视化大屏
def main(self):
self.info_data() # 运行数据概况函数
self.page() # 运行可视化大屏函数
if __name__ == '__main__':
lianjia = Lianjia_anylize() # 创建实例对象
lianjia.main() # 运行主函数