最近想用pyecharts做一个简单的可联动的数据大屏。
作为猛xin,将目前屎一样代码防止下方,供各位帮忙解决。目的就是想将Bar加入到具有Timeline联动功能的Grid中,谢谢。
import os
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar, Grid, Line, Liquid, Page, Pie,Timeline,Map,WordCloud
from pyecharts.commons.utils import JsCode
from pyecharts.components import Table
from pyecharts.faker import Faker
from pyecharts.globals import ThemeType
import jieba
from pyecharts import options as opts
from pyecharts.charts import Map, Timeline, Pie
from pyecharts.faker import Faker
os.chdir(r'C:\Users\XX\Desktop')
data_park = pd.DataFrame(pd.read_csv('公园情绪数据库2.csv'))
data_park_need = data_park[['公园名', '公园类','县级名','OID_','评论内', '经度', '纬度', '地理位', 'score', 'keywork', 'ID', '分词', '功能类','交通出', '设施设', '生态环', '空间要', '商业业', '历史文', '面积']]
parkclass_data = data_park_need['score'].groupby([data_park_need['公园类'],data_park_need['县级名']]).mean().reset_index()
parkclass_list = parkclass_data['公园类'].drop_duplicates().reset_index()
parkclass_list = parkclass_list['公园类']
#按类型进行区分
##按类型测算得分情况
parkmap_data = data_park_need['score'].groupby([data_park_need['县级名'],data_park_need['公园类']]).mean().reset_index()
parkmap_data['score'] = parkmap_data['score'].round(3)
##按类型测算排名情况
rank = data_park_need['score'].groupby([data_park_need['公园名'],data_park_need['公园类'],data_park_need['县级名']]).mean().reset_index()
rank_010 = rank.sort_values(by=['score'])
def make_Bar(T_df):
t = (
Bar()
.add_xaxis(list(T_df["公园名"]))
.add_yaxis('得分情况',list(T_df["score"]))
)
print('已完成倒数排行图')
return t
def make_Map(m_df):
data_park_qu = m_df['score'].groupby(m_df['县级名']).mean().reset_index()
c = (
Map(init_opts = opts.InitOpts(chart_id = 'Map',width = "280px",height='160px'))
.add("公园情绪",
[list(z) for z in zip(data_park_qu.县级名, data_park_qu.score)],
"XX",
layout_center = ['20%','30%'],
layout_size = '400',
is_roam = False,
label_opts = opts.LabelOpts(font_size = 10.5),
)
.set_global_opts(
title_opts = opts.TitleOpts(title="XX市中心城区公园",pos_left='center'),
visualmap_opts = opts.VisualMapOpts(min_ = 0.1, max_ = 1),
legend_opts = opts.LegendOpts(is_show = False)
)
)
print('已完成区市县级地图')
return c
def make_pie(b_df):
data_bark = b_df['score'].groupby(b_df['县级名']).mean().reset_index()
pie = (
Pie(init_opts = opts.InitOpts(chart_id = 'pie',width = "280px",height='160px'))
.add(
"中心城区不同类型公园情绪得分",
[list(z) for z in zip(b_df.县级名, b_df.score)],
center=["20%", "75%"],
is_still_show_zero_sum=False,
radius = "30%",
)
.set_global_opts(
legend_opts = opts.LegendOpts(is_show = False)
)
)
print('已完成饼图')
return pie
tl = Timeline(init_opts=opts.InitOpts(width="1388px", height="790px", theme=ThemeType.DARK))
for i in range(0,5):
parkmap = (
make_Map(parkmap_data[parkmap_data['公园类'] == str(parkclass_list[i])])
)
parkpie = (
make_pie(parkmap_data[parkmap_data['公园类'] == str(parkclass_list[i])])
)
parkrank =(
make_Bar(rank_010[rank_010['公园类'] == str(parkclass_list[i])])
)
grid = Grid()
grid.add(parkmap,grid_opts=opts.GridOpts())
grid.add(parkpie,grid_opts=opts.GridOpts())
grid.add(parkrank,grid_opts=opts.GridOpts())
tl.add(grid,"{}".format(str(parkclass_list[i])))
tl.render("timeline_pie.html")
问题分析:
根据报错信息,可以看出是因为在添加第三个图表时,没有指定其所属的 Grid,导致程序无法确定其位置。具体来说,是在以下代码中出现问题:
python
grid = Grid()
grid.add(parkmap,grid_opts=opts.GridOpts())
grid.add(parkpie,grid_opts=opts.GridOpts())
grid.add(parkrank,grid_opts=opts.GridOpts())
在这里,我们创建了一个 Grid 对象,并向其中添加了三个图表。但是,我们没有指定第三个图表所属的 Grid,因此程序无法确定其位置,从而报错。
解决方案:
要解决这个问题,我们需要在添加第三个图表时,指定其所属的 Grid。具体来说,可以将代码修改为以下形式:
python
grid1 = Grid()
grid1.add(parkmap,grid_opts=opts.GridOpts())
grid1.add(parkpie,grid_opts=opts.GridOpts())
grid2 = Grid()
grid2.add(parkrank,grid_opts=opts.GridOpts())
tl.add(grid1, "{}".format(str(parkclass_list[i])))
tl.add(grid2, "{}".format(str(parkclass_list[i])))
在这里,我们创建了两个 Grid 对象,分别用于存放前两个图表和第三个图表。然后,我们将这两个 Grid 对象分别添加到 Timeline 中,并指定它们所属的时间点。这样,就可以解决报错问题了。
这个错误通常出现在列表(list)或字典(dict)中使用了 None 值,而列表或字典却无法接受 None 值。
根据你提供的代码,可能是由于 make_Bar() 函数中未定义 return 语句导致返回 None 值,从而导致这个错误。你可以尝试修改 make_Bar() 函数,确保它能返回正确的 Bar() 对象。
这个错误通常发生在你试图对一个空对象调用 extend() 方法时。请检查你的代码,确保在调用 extend() 方法之前已经为对象分配了正确的值。你也可以使用 if 语句检查对象是否为 NoneType,以避免这种错误。
这个错误通常出现在列表(list)或字典(dict)中使用了 None 值,而列表或字典却无法接受 None 值。
根据你提供的代码,可能是由于 make_Bar() 函数中未定义 return 语句导致返回 None 值,从而导致这个错误。你可以尝试修改 make_Bar() 函数,确保它能返回正确的 Bar() 对象。
这个错误通常发生在你试图对一个空对象调用 extend() 方法时。请检查你的代码,确保在调用 extend() 方法之前已经为对象分配了正确的值。你也可以使用 if 语句检查对象是否为 NoneType,以避免这种错误。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据您提供的代码,我发现在 make_Bar()
函数中,您没有设置 x 轴和 y 轴的名称以及 title,因此可能导致添加 Bar()
图表到 Grid()
时出现错误。您可以尝试为 Bar()
设置这些参数,例如:
def make_Bar(T_df):
t = (
Bar()
.add_xaxis(list(T_df["公园名"]))
.add_yaxis('得分情况',list(T_df["score"]))
.set_global_opts(
xaxis_opts=opts.AxisOpts(name='公园名'),
yaxis_opts=opts.AxisOpts(name='得分情况'),
title_opts=opts.TitleOpts(title='得分情况倒数排名'),
)
)
print('已完成倒数排行图')
return t
另外,如果 Grid()
中的图表数量超过两个,您需要为每个图表设置 height
和 top
参数以保证它们在页面中的显示。例如:
grid.add(parkrank, grid_opts=opts.GridOpts(height="30%", top="65%"))
最后,您可以尝试使用 timeline_opts
选项来控制时间线的显示格式,例如:
tl = (
Timeline(
init_opts=opts.InitOpts(
width="1388px",
height="790px",
theme=ThemeType.DARK,
)
)
.add_schema(
orient="vertical",
is_auto_play=True,
play_interval=5000,
pos_left="null",
pos_right="5",
pos_bottom="5",
height="90%",
width="50",
label_opts=opts.LabelOpts(is_show=True, color="#fff", font_size=12),
timeline_opts=opts.TimelineOpts(
is_show=True,
play_interval=5000,
width="50px",
label_opts=opts.LabelOpts(is_show=True, color="#fff", font_size=12),
),
)
)
希望这些调整可以帮助您解决问题。如果还有其他问题,请随时提供更多细节和代码以供参考。
如果我的回答解决了您的问题,请采纳!
该回答引用于gpt与OKX安生共同编写:
根据你提供的代码和错误信息,推测问题可能出在将 Bar 实例添加到 Grid 中时所使用的参数上。具体来说,add()
方法需要传递 series_name
参数以及 xaxis_index
和 yaxis_index
参数中的至少一个。由于你没有设置 series_name
参数,添加 Bar 的过程中可能会出现异常。
为了解决这个问题,你可以尝试在调用 add()
方法时提供正确的参数。例如,下面是一种可能的方法:
grid.add(parkrank, grid_opts=opts.GridOpts(), series_name='bar', yaxis_index=1)
在上面的示例中,我们已经指定了 series_name
参数,该参数用于标识要添加的系列类型。另外,我们还将 yaxis_index
参数设置为 1,以确保 Bar 图表将被放置在 Grid 的第二个 y 轴上。
请注意,如果你想要进一步自定义 Grid 的布局和调整 Bar 图表的位置和大小,还可以使用其他可用选项,例如 pos_left
、pos_top
、width
、height
等等。
希望这些建议能够帮助你解决问题。如果你仍然遇到困难,请告诉我,我很乐意为你提供更多帮助。
感谢大佬,目前是能把图表添加进去了,但是添加之后似乎控制器没能实现“共用”,下面那个时间轴控制器变成了“各管各的”,不同grid自己管自己的