def locate_on_map(addr, longtitude, latitude): g = Geo().add_schema(maptype="上海") g.add_coordinate(addr, longtitude, latitude) data_pair = [(addr, 1)] g.add('', data_pair, type_=GeoType.EFFECT_SCATTER, symbol_size=20) g.set_series_opts(label_opts=options.LabelOpts(is_show=False)) g.set_global_opts(title_opts=options.TitleOpts(title="地图标点测试")) g.render_notebook() print("process finished")
def quakes(): # 对地震数据进行绘图 quakes_data = pd.read_csv("quakes.csv") latitude = quakes_data['lat'].values longitude = quakes_data['long'].values mag = quakes_data['mag'].values index = list(range(len(mag))) #可视化 geo = Geo() geo.add_schema(maptype='world') for i in range(len(index)): geo.add_coordinate(index[i], longitude[i], latitude[i]) data_pair = [list(z) for z in zip(index, mag)] # 将数据添加进图中 geo.add('震源', data_pair, symbol_size=3) geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 设置显示区间 pieces = [ { 'max': 4, 'label': '4级以下', 'color': '#50A3BA' }, { 'min': 4, 'max': 5, 'label': '4-5级', 'color': '#E2C568' }, { 'min': 5, 'max': 6, 'label': '5-6级', 'color': '#D94E5D' }, { 'min': 6, 'max': 7, 'label': '6-7级', 'color': '#3700A4' }, { 'min': 7, 'label': '7级以上', 'color': '#81AE9F' }, ] geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=pieces), title_opts=opts.TitleOpts(title="震源分布")) #导出图像 geo.render('地震地点分布.html')
def base_info(): geo = Geo() geo.add_schema(maptype="河南") # 加入自定义的点,格式为 # 地图形式 type_=ChartType.HEATMAP geo.add("geo", data, type_=ChartType.EFFECT_SCATTER) # is_show:是否显示经纬度 geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=10), title_opts=opts.TitleOpts(title="Geo-河南省地图")) return geo
def out_data(date_number): city_list = ('南宁市', '柳州市', '桂林市', '梧州市', '北海市', '防城港市', '钦州市', '贵港市', '玉林市', '百色市', '贺州市', '河池市', '来宾市', '崇左市') city_od_list_pro = [] city_od_values_pro = [] for i in city_list: city = i workbook = xlrd.open_workbook(f'.\\{path}\\{city}-迁入来源地规模指数.xlsx') sheet = workbook.sheet_by_index(0) city_od_list = [] city_od_values = [] a = 0 cols = sheet.col_values(1)[1:] cols_date = sheet.col_values(date_number + 1)[1:] for j in cols: city_od = (city, j) city_od_v = (j, cols_date[a]) city_od_list.append(city_od) city_od_values.append(city_od_v) a += 1 city_od_list_pro.append(city_od_list) city_od_values_pro.append(city_od_values) od_list = [] os_values = [] for i in range(14): for j in range(14): od_list.append(city_od_list_pro[i][j]) os_values.append(city_od_values_pro[i][j]) # print(od_list) # print(os_values) geo = Geo() # 地图类型,世界地图可换为world geo.add_schema(maptype="广西") # 添加数据点 geo.add("%", os_values, type_=ChartType.EFFECT_SCATTER) # 添加流向,type_设置为LINES,涟漪配置为箭头,提供的标记类型包括 'circle', 'rect', 'roundRect', 'triangle', # 'diamond', 'pin', 'arrow', 'none' geo.add("迁出城市", od_list, type_=ChartType.LINES, effect_opts=opts.EffectOpts(symbol=SymbolType.ARROW, symbol_size=5, color="yellow"), linestyle_opts=opts.LineStyleOpts(curve=0.2), is_large=True) # 不显示标签 geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 设置图标标题,visualmap_opts=opts.VisualMapOpts()为左下角的视觉映射配置项 geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(), title_opts=opts.TitleOpts(title="广西地市迁徙数据")) # 直接在notebook里显示图表 geo.render_notebook() # 生成html文件,可传入位置参数 geo.render(f".\\out_od\\广西-2020.10.{date_number}迁出OD图.html")
def drawGeoMap(excel_path, mtype='china'): data = xlrd.open_workbook(excel_path) table = data.sheet_by_index(0) nrow = table.nrows dates = table.row_values(0) # print(dates) allData = {} for i in range(1, nrow): aNameData = {} sname = f"{table.cell(i,0).value} {table.cell(i,1).value}" for j in range(2, len(dates)): value = table.cell(i,j).value try: value = json.loads(value) value = value[1:4] except Exception as e: print(f"error: {e}") pass aNameData[dates[j]] = value allData[sname] = aNameData # print(f'学生数:{len(allData)}') title = '2021年1月21日能仔位置' geo = Geo(init_opts=opts.InitOpts(width='1000px', height='580px', page_title=title, theme=ThemeType.LIGHT)) geo.add_schema(maptype=mtype) for name, data in allData.items(): for date, location in data.items(): aNameLocation = [] try: longitude, latitude, address = location except Exception as e: print(f"Error: {e}") longitude, latitude, address = DEFAULT_Location # aNameLocation.append(('%s %s\n' % (name, date), address)) # geo.add_coordinate('%s %s' % (name, date), longitude, latitude) sno, sname = name.split(' ') # print(sno, sname) aNameLocation.append(('%s %s' % (sno, sname), date)) geo.add_coordinate('%s %s' % (sno, sname), longitude, latitude) geo.add(name, aNameLocation, type_=ChartType.EFFECT_SCATTER) geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) geo.set_global_opts(legend_opts=opts.LegendOpts(type_='scroll', orient='vertical', pos_left='left', pos_top='10%', is_show=False), title_opts=opts.TitleOpts(title=title)) map_path = os.path.join(dir_path, '2021年1月21日能仔位置地图.html') geo.render(map_path) # os.system(f'"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" {os.path.abspath(map_path)}') print('done.')
def draw_map(data_pair, data_coordinate) -> Geo: # ->常常出现在python函数定义的函数名后面,为函数添加元数据,描述函数的返回类型,从而方便开发人员使用。 g = Geo() # 选择要显示的地图 g.add_schema(maptype="重庆", center=[106.531638,29.561081], itemstyle_opts=opts.ItemStyleOpts(color="#575D57")) # 使用add_coordinate(name, lng, lat)添加坐标点和坐标名称 for item in data_coordinate: g.add_coordinate(item['name'], item['lng'], item['lat']) # 将数据添加到定义的地图上 g.add('', data_pair, type_=GeoType.EFFECT_SCATTER, symbol_size=5) # type_=ChartType.HEATMAP # 设置样式 g.set_series_opts(label_opts=opts.LabelOpts(is_show=False))\ .set_global_opts(visualmap_opts=opts.VisualMapOpts(min_=60, max_ = 200, is_piecewise=True),title_opts=opts.TitleOpts(title="重庆房源分布图")) return g
def base_info(): print(data) geo = Geo() geo.add_schema(maptype="china") # 加入自定义的点,格式为 # geo.add_coordinate("自定义点", 80.39770014211535,39.90779994986951) # 地图形式 type_=ChartType.HEATMAP geo.add("geo", data, type_=ChartType.EFFECT_SCATTER) # is_show:是否显示经纬度 geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(), title_opts=opts.TitleOpts(title="Geo-基本示例")) return geo
def insert_loc(): g = Geo() data_pair = [] g.add_schema(maptype='china') airport_df = pd.read_excel('CN_airport_info.xlsx', usecols='B,D,E,F,S') for i in range(len(airport_df)): g.add_coordinate(airport_df.iloc[i, 1], float(airport_df.iloc[i, 3]), float(airport_df.iloc[i, 2])) data_pair.append((airport_df.iloc[i, 1], int(airport_df.iloc[i, 4]))) g.add('', data_pair, type_=GeoType.EFFECT_SCATTER, symbol_size=7) g.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) g.set_global_opts( visualmap_opts=opts.VisualMapOpts(is_piecewise=False), title_opts=opts.TitleOpts(title="全国机场分布图"), ) return g
def base_info(): geo = Geo() geo.width = "1440px" geo.height = "680px" geo.add_schema(maptype="china") geo.add("确诊人数", confirmed, type_=ChartType.EFFECT_SCATTER) geo.add("疑似人数", suspect, type_=ChartType.EFFECT_SCATTER) geo.add("死亡人数", dead, type_=ChartType.EFFECT_SCATTER) geo.add("治愈人数", healed, type_=ChartType.EFFECT_SCATTER) geo.set_series_opts( label_opts=opts.LabelOpts(is_show=False, background_color='#61a0a8')) geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(), title_opts=opts.TitleOpts( title="中国ncov-2019疫情动态\n上一次数据更新时间:\n" + time)) return geo
def geo_base(): city_data = get_data() print(city_data) geo = Geo(init_opts=opts.InitOpts(theme="vintage")) for city in city_data: try: geo.add_schema(maptype="china", itemstyle_opts=opts.ItemStyleOpts(color="gray")) geo.add("微信好友分布地图", [city], type_="effectScatter", symbol_size=10) geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) geo.set_global_opts( visualmap_opts=opts.VisualMapOpts(), title_opts=opts.TitleOpts(title="来自中南海的瓶子"), ) except Exception as e: print(city) pass geo.render("ms_geo.html")
def draw_with_echarts_scatter(): '''使用pyecharts画散点图''' try: device_csv_dir = r'E:/test_opencv/车辆经常停留位置/all_device_data_csv/' pyecharts_device_html_dir = r'E:/test_opencv/车辆经常停留位置/pyecharts_device_html/' if not os.path.exists(device_csv_dir): os.makedirs(device_csv_dir) if not os.path.exists(pyecharts_device_html_dir): os.makedirs(pyecharts_device_html_dir) for item in os.listdir(device_csv_dir): csvlName = device_csv_dir + item df = pd.read_csv(csvlName, encoding='utf-8', low_memory=False) # X = df.drop_duplicates(subset=['longitude', 'latitude']) X = df device_id = X['device_id'].iloc[0] # 取组内第一个device_id用于存csv用 staff_id = X['staff_id'].iloc[0] # 取组内第一个staff_id用于存csv用 staff_name = X['staff_name'].iloc[0] # 取组内第一个staff_name用于存csv用 car_id = X['car_id'].iloc[0] # 取组内第一个car_id用于存csv用 car_num = X['car_num'].iloc[0] # 取组内第一个car_num用于存csv用 create_time_1 = X['create_time_1'].iloc[0] # 取组内第一个create_time_1用于存csv用 g = Geo() g.add_schema(maptype="china") # 给所有点附上标签 'create_time' for index, row in X.iterrows(): g.add_coordinate(row['create_time'], row['remain_longitude'], row['remain_latitude']) create_time = X.create_time.values.tolist() # 给每个点的值赋为 1 data_list = [[item, 1] for item in create_time] # 画图 # g.add('', data_list, type_=GeoType.HEATMAP, symbol_size=2) g.add('', data_list, type_=GeoType.EFFECT_SCATTER, symbol_size=2) g.set_series_opts(label_opts=options.LabelOpts(is_show=False)) #heatmap # g.set_global_opts(visualmap_opts=options.VisualMapOpts(), title_opts=options.TitleOpts(title=staff_name+"_" + str(car_num) + '_' + str(create_time_1) +'_heatmap' ,pos_left='50%',pos_top='20')) #scatter g.set_global_opts(title_opts=options.TitleOpts(title=staff_name+"_" + str(car_num) + '_' + str(create_time_1) +'_scatter' ,pos_left='50%',pos_top='20')) # 保存结果到 html result = g.render(pyecharts_device_html_dir + str(staff_name) + '_' +str(car_num) + '_' + str(create_time_1) + '.html') except Exception as ex: logger.error("Call method draw_with_echarts_scatter() error!") logger.error("Exception:" + str(ex)) raise ex
def geo_heatmap(k, v) -> Geo: try: c = Geo() c.add_schema(maptype="china") c.add( "ratio", [list(z) for z in zip(k, v)], type_=ChartType.HEATMAP, ) except TypeError: print("地址有误,开始排错......") with open("place.txt", mode="a") as f: i = 0 c = Geo() c.add_schema(maptype="china") while i < len(k): try: c.add( "ratio", [list(z) for z in zip(k[:i], v[:i])], type_=ChartType.HEATMAP, ) except: print(k[i - 1]) f.writelines(k[i - 1]) f.writelines('\n') del k[i - 1] del v[i - 1] i -= 1 continue else: i += 1 geo_heatmap(k, v) else: c.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) timen = datetime.datetime.now().strftime('%Y-%m-%d') timea = datetime.datetime.now().strftime('%Y-%m-%d %H.%M.%S') c.set_global_opts( visualmap_opts=opts.VisualMapOpts(), title_opts=opts.TitleOpts(title="2019nCoV{} BY PZW".format(timen))) Geo.render(c, path='{}HEATMAP.html'.format(timea)) print('渲染完毕')
def get_company_city(self): sql = """ select city,count(distinct url) as company_count from lagou_company GROUP BY city """ result = cursor.execute(sql) key = [] values = [] for info in cursor.fetchall(): if info[0] != '海外' and re.match('[\u4e00-\u9fa5]', info[0]): key.append(info[0]) values.append(info[1]) geo = Geo(init_opts=opts.InitOpts(width="1600px", height="1000px")) geo.add_schema(maptype="china") geo.add("公司分布", [list(z) for z in zip(key, values)], type_="heatmap") geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(), title_opts=opts.TitleOpts(title="各城市公司分布")) file = data_store + "\\" + "company.html" check_path(file) geo.render(file)
def plot(): # 初始化图表信息 geo = Geo(init_opts=opts.InitOpts(width="96vw", height="96vh", page_title="教育网拓扑图", animation_opts=opts.AnimationOpts( animation=False))) # 添加地图 geo.add_schema(maptype="china") # 添加所有点的地理信息 geo.add_coordinate_json("./data/data.json") # 画中间节点 geo.add("Route", [(i, "Route") for i in Nodes_Route], color="Red", point_size=4, symbol_size=4, effect_opts=opts.EffectOpts(is_show=False)) # 画目的节点 geo.add("Dst", [(i, "Dst") for i in Nodes_Dst], color="SeaGreen", point_size=4, symbol_size=4, effect_opts=opts.EffectOpts(is_show=False)) # 画线 展示拓扑信息 geo.add("", list(Trace), type_=ChartType.LINES, effect_opts=opts.EffectOpts(is_show=False, symbol_size=2), linestyle_opts=opts.LineStyleOpts(curve=0.1)) geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) geo.set_global_opts(title_opts=opts.TitleOpts(title="教育网拓扑图")) # 生成图表到指定文件 geo.render("./dist/render.html")
def get_geo_base(self, _data): ''' plot geo-HeatMap :param _data: gps对应的城市分布(dataframe) :return: geo城市分布图 ''' register_url(self.echarts_url) geo = Geo(init_opts=opts.InitOpts(width="1000px", height="600px", page_title=self.country, bg_color='')) geo.add_schema(maptype=self.country) for _city, _gps in self.geo_dict.items(): geo.add_coordinate(name=_city, longitude=_gps[0], latitude=_gps[1]) geo.add(series_name=self.series_name, data_pair=_data, type_=ChartType.HEATMAP) geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) geo.set_global_opts( visualmap_opts=opts.VisualMapOpts(max_=self.threshold_plot), title_opts=opts.TitleOpts(title="Geo-HeatMap")) return geo
def country_job_num(self): df = pd.read_csv( "D:\PythonFile\LagouSpider\imags\CsvFile\LagouPosition.csv") citys = df.city count = Counter(citys) # count = count.most_common(len(count)) city_list = [] for city in count: city_list.append([city, count[city]]) map = Geo() map.add_schema("china") map.add("geo", city_list, type_=ChartType.EFFECT_SCATTER) map.set_series_opts(label_opts=opt.LabelOpts(is_show=False)) map.set_global_opts( visualmap_opts=opt.VisualMapOpts(), title_opts=opt.TitleOpts(title="Python开发工程师分布情况"), ) map.render( path="D:\PythonFile\LagouSpider\imags\pic/Python开发工程师分布情况.html")
def plot_geo_heatmap(all_df): """画热力图 Args: all_df (dataframe): 每日数据图 """ def valid_area(x, v): if x.get_coordinate(v) is not None: return 'Y' else: return 'N' c = Geo(init_opts=opts.InitOpts(width='800px', height='600px')) all_df['valid'] = all_df['name'].apply(lambda x: valid_area(c, x)) all_df['plot_v'] = np.log2(all_df['confirm_all'] / 50 + 1) * 10 c.add_schema(maptype="china") c.add( "ratio", all_df.loc[all_df['valid'] == 'Y', ['name', 'plot_v']].values, type_=ChartType.HEATMAP, ) c.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) c.set_global_opts( visualmap_opts=opts.VisualMapOpts(), legend_opts=opts.LegendOpts(is_show=False), title_opts=opts.TitleOpts( pos_left='center', title='2020 Novel coronavirus pneumonia (NCP) ', title_link= 'https://news.qq.com/zt2020/page/feiyan.htm?from=timeline&isappinstalled=0' )) # map_p = Map() # map_p.set_global_opts(title_opts=opts.TitleOpts(title="实时疫情图"), visualmap_opts=opts.VisualMapOpts(max_=100)) # map_p.add("确诊", data, maptype="china") Geo.render(c, path='E:/HEATMAP.html')
def in_data(city, date_number): workbook = xlrd.open_workbook(f'.\\{path}\\{city}-迁入来源地规模指数.xlsx') sheet = workbook.sheet_by_index(0) city_od_list = [] city_od_values = [] a = 0 cols = sheet.col_values(1)[1:] cols_date = sheet.col_values(date_number + 1)[1:] for j in cols: city_od = (j, city) city_od_v = (j, cols_date[a]) city_od_list.append(city_od) city_od_values.append(city_od_v) a += 1 geo = Geo() # 地图类型,世界地图可换为world geo.add_schema(maptype="广西") # 添加数据点 geo.add("%", city_od_values, type_=ChartType.EFFECT_SCATTER) # 添加流向,type_设置为LINES,涟漪配置为箭头,提供的标记类型包括 'circle', 'rect', 'roundRect', 'triangle', # 'diamond', 'pin', 'arrow', 'none' geo.add("迁入城市", city_od_list, type_=ChartType.LINES, effect_opts=opts.EffectOpts(symbol=SymbolType.ARROW, symbol_size=5, color="yellow"), linestyle_opts=opts.LineStyleOpts(curve=0.2), is_large=True) # 不显示标签 geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 设置图标标题,visualmap_opts=opts.VisualMapOpts()为左下角的视觉映射配置项 geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(), title_opts=opts.TitleOpts(title=f"{city}迁入数据")) # 直接在notebook里显示图表 geo.render_notebook() # 生成html文件,可传入位置参数 geo.render(f".\\in_od\\{city}-2020.10.{date_number}迁入OD图.html")
def generate_geo_png(geodata, geomax, geomin, geotitle, display_id, map_data_title): from pyecharts import options as opts from pyecharts.charts import Map, Geo from pyecharts.render import make_snapshot # from pyecharts_snapshot.main import make_a_snapshot from snapshot_selenium import snapshot geo = Geo() geo.add_coordinate_json( '/home/CitizenScience/backend/backend/geoCoordJson.js') geo.add_schema(maptype="china") print(geodata) print(map_data_title) geo.add(" ", geodata, symbol_size=10) geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) geo.set_global_opts( visualmap_opts=opts.VisualMapOpts(max_=geomax, min_=geomin)) figure_url = "/home/CitizenScience/file/visualization/" + str( display_id) + '_geo.png' # figure_url = str(display_id) + '_geo.png' make_snapshot(snapshot, geo.render(), figure_url, 2) # geo.render(path='render.html') # cmd = "snapshot render.html png" # try: # isRun = os.system(cmd) # print("截图完成") # except: # print("截图失败") # cmd = "mv output.png ../file/visualization/{}".format(figure_url) # try: # isRun = os.system(cmd) # print("移动完成") # except: # print("移动失败") # make_a_snapshot('geo2.html', 'geo3.png') return figure_url
("黄埔",1), ("秦皇岛",1), ("南通",1), ("杭州",1), ("上海",1), ("香港",1), ("澳门",1), ("深圳",1), ("汕头",1), ("烟台",1), ("威海",1), ("芜湖",1), ("南京",1), ("温州",1), ("嘉兴",1), ],type_=ChartType.EFFECT_SCATTER,color="gold") c.add("机场", [("北京",6), ("呼和浩特",4), ("南昌",4), ("贵州",4), ("成都",4), ("哈尔滨",2), ("乌鲁木齐",1), ("郑州",1), ("沈阳",2), ("长春",1), ],type_=ChartType.EFFECT_SCATTER,color="deepskyblue") c.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title="港口机场分布图")) c.render_notebook()
def city_distribution(df): df['city'] = df.city.replace(re.compile(r'[a-zA-Z]+'), '国外') # 筛选国外城市 df_city1 = [] for i in df['city']: i = str(i) if '国外' in i: df_city1.append('国外') else: df_city1.append(i) df['city'] = df_city1 # 提取城市名 df_city2 = [] for i in df['city']: i = str(i) # 处理形如 县级市,地级市 数据 if ',' in i: i = i.split(',')[1].strip() elif len(i) == 4: i = i[2:] elif len(i) > 4: if '中国台湾' in i: i = i[4:] elif '内蒙古' in i or '黑龙江' in i: i = i[3:] else: i = i[2:] df_city2.append(i) df['city'] = df_city2 # 筛选出国内城市Top10 city_top = df.city.value_counts() if '国外' in city_top.index: city_top.drop('国外', inplace=True) if '未知' in city_top.index: city_top.drop('未知', inplace=True) if city_top.count() > 10: city_top = city_top[:10] print('Top10 cities:') print(city_top) # 绘制条形图 bar = Bar(init_opts=opts.InitOpts(width='1350px', height='750px')) bar.add_xaxis(city_top.index.tolist()) bar.add_yaxis('评论人次', city_top.values.tolist()) bar.set_global_opts(title_opts=opts.TitleOpts(title='评论者Top10城市分布'), toolbox_opts=opts.ToolboxOpts()) # 绘制Top30城市分布地理图(国内) city_num = df.city.value_counts() if '国外' in city_num.index: city_num.drop('国外', inplace=True) if '未知' in city_num.index: city_num.drop('未知', inplace=True) if city_num.count() > 30: city_num = city_num[:30] print('Top30 cities:') print(city_num) geo = Geo(init_opts=opts.InitOpts(width='1350px', height='750px')) geo.add_schema(maptype='china') geo.add( '', [list(z) for z in zip(city_num.index, city_num.values.astype('str'))], type_=GeoType.EFFECT_SCATTER) geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(), title_opts=opts.TitleOpts(title='评论者城市分布'), toolbox_opts=opts.ToolboxOpts()) geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) return bar, geo
"color": "cyan" }, { "value": "7", "label": "G", "color": "purple" } ], ), legend_opts=opts.LegendOpts( # 设置图例配置项 pos_right="right", pos_top="top", orient="vertical", ), ) geo.set_series_opts(label_opts=opts.LabelOpts( # 设置标签配置项 is_show=False # 设置不显示Label )) geo.render("demo03.html") # 生成名为"demo03"的本地html文件 # customMap = ( # Map() # .add("商家A", # 图例 # [list(z) for z in zip(Faker.provinces, Faker.values())], # 数据项 # "china" # 地图 # ) # .set_global_opts( # 设置全局项 # title_opts=opts.TitleOpts( # 设置标题项 # title="中国地图" # 设置标题名称 # ) # )
def test_geo(): city = '长沙' g = Geo() g.add_schema(maptype='河南') # 定义坐标对应的名称,添加到坐标库中 add_coordinate(name, lng, lat) # g.add_coordinate('湖南省长沙市宁乡市横市镇藕塘', 112.21369756169062, 28.211359706637378) # g.add_coordinate('湖南省长沙市雨花区跳马镇仙峰岭', 113.16921879037058, 28.039877432448428) # g.add_coordinate('湖南省长沙市长沙县黄花镇新塘铺长沙黄花国际机场', 113.23212337884058, 28.19327497825815) # 定义数据对, # data_pair = [('湖南省长沙市雨花区跳马镇仙峰岭', 10), ('湖南省长沙市宁乡市横市镇藕塘', 5), ('湖南省长沙市长沙县黄花镇新塘铺长沙黄花国际机场', 20)] data_pair = list(temp_d.items()) # Geo 图类型,有 scatter, effectScatter, heatmap, lines 4 种,建议使用 # from pyecharts.globals import GeoType # GeoType.GeoType.EFFECT_SCATTER,GeoType.HEATMAP,GeoType.LINES # 将数据添加到地图上 g.add('', data_pair, type_=GeoType.EFFECT_SCATTER, symbol_size=15) # 设置样式 g.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 自定义分段 color 可以用取色器取色 # pieces = [ # {'max': 1, 'label': '0以下', 'color': '#50A3BA'}, # {'min': 1, 'max': 10, 'label': '1-10', 'color': '#3700A4'}, # {'min': 10, 'max': 20, 'label': '10-20', 'color': '#81AE9F'}, # {'min': 20, 'max': 30, 'label': '20-30', 'color': '#E2C568'}, # {'min': 30, 'max': 50, 'label': '30-50', 'color': '#FCF84D'}, # {'min': 50, 'max': 100, 'label': '50-100', 'color': '#DD0200'}, # {'min': 100, 'max': 200, 'label': '100-200', 'color': '#DD675E'}, # {'min': 200, 'label': '200以上', 'color': '#D94E5D'} # 有下限无上限 # ] pieces = [ { 'min': 0, 'max': 3, 'label': '类别1', 'color': '#50A3BA' }, #有上限无下限,label和color自定义 { 'min': 4, 'max': 6, 'label': '类别2', 'color': '#81AE9F' }, { 'min': 7, 'max': 8, 'label': '类别3', 'color': '#E2C568' }, # {'min': 150, 'max': 300,'label': '150-300','color':'#FCF84D'}, # {'min': 300, 'label': '300以上','color':'#D94E5D'}#有下限无上限 ] # is_piecewise 是否自定义分段, 变为true 才能生效 g.set_global_opts( visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=pieces), title_opts=opts.TitleOpts(title="城市聚类"), ) return g
data = pd.read_excel("D:\数有引力\魔都商圈\办公项目.xlsx") # 读取数据 geo_sight_coord = { data['项目名称'][i].strip(): [data['经度'][i], data['纬度'][i]] for i in range(len(data)) } # 构造位置字典数据 data_pair = [(data['项目名称'][i].strip(), data['日租金'][i]) for i in range(len(data))] # 构造项目租金数据 g = Geo() # 地理初始化 g.add_schema(maptype="上海") # 限定上海市范围 for key, value in geo_sight_coord.items(): # 对地理点循环 g.add_coordinate(key, value[0], value[1]) # 追加点位置 g.add("", data_pair, symbol_size=2) # 追加项目名称和租金 g.set_series_opts(label_opts=opts.LabelOpts(is_show=False), type='scatter') # 星散点图scatter pieces = [ { 'max': 3, 'label': '<3', 'color': '#00B2EE' }, { 'min': 3, 'max': 6, '3~6': 'love', 'color': '#71C671' }, { 'min': 6,
avg_salary_by_loc = salary_data.groupby(loc_data).mean() \ .sort_values(ascending=False) avg_salary_by_loc.plot.bar() for i, v in enumerate(avg_salary_by_loc): plt.text(i, v, round(v, 2), ha='center', va='bottom') plt.title('不同区域平均工资柱状图', fontproperties=font_zh) plt.xticks(range(len(avg_salary_by_loc)), avg_salary_by_loc.index, fontproperties=font_zh) plt.xlabel('区域', fontproperties=font_zh) plt.ylabel('平均工资(千/年)', fontproperties=font_zh) loc_list = [[i, loc_counts[i]] for i in loc_counts.index] geo = Geo().add_schema(maptype='成都') geo.add('区域分布热度图', loc_list, type_=ChartType.HEATMAP) # 设置名称和数据 geo.set_series_opts(label_opts=opts.LabelOpts(is_show=True)) # 设置标签是否可见 geo.set_global_opts(visualmap_opts=opts.VisualMapOpts()) # 视觉映射配置 geo.render('./loc_heatmap.html') # 保存为网页 os.system('"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"\ ./loc_heatmap.html') # 打开网页 # 工作经验分析 exp_data = data['job_exp'] exp_des = exp_data.describe() # 工作经验基本数据描述,包括平均数、中位数等 exp_counts = exp_data.value_counts().sort_index() # 按实际值进行频率统计 fig = plt.figure('平均工作经验统计详情', figsize=[16, 5]) plt.subplots_adjust(left=0.03, bottom=0.15, right=0.97, top=0.9, wspace=0.25) ax1 = fig.add_subplot(161) plt.title('平均工作经验年限详情描述', fontproperties=font_zh)
city2 = sheet.col_values(8)#降落城市 speed = sheet.col_values(22)#飞机速度 vspeed = sheet.col_values(23)#垂直速度 height = sheet.col_values(24)#飞行高度 uptime = sheet.col_values(26)#时间 c = Geo() # 加载图表模型中的中国地图 c.add_schema(maptype="china") i = 1 for i in range(1,10): c.add_coordinate("航班号" + flightnumber_list[i], long_list[i], lat_list[i]) # 为自定义的点添加属性 c.add("geo", [("航班号" + flightnumber_list[i], "航空公司:"+aircname[i]+" "+city1[i]+"飞往"+city2[i]+" 飞行速度:"+str(speed[i])+" 垂直速度:"+str(vspeed[i])+" 高度:"+str(height[i])+" 时间"+uptime[i])]) # 设置坐标属性 c.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 设置全局属性 c.set_global_opts( visualmap_opts=opts.VisualMapOpts(), title_opts=opts.TitleOpts(title="航班信息可视化"), ) # 在 html(浏览器) 中渲染图表 c.render() # 在 Jupyter Notebook 中渲染图表 c.render_notebook()
addr_dic[provice] = 0 addr_dic[provice] += 1 # print(addr_dic) # print(addr_dic.items()) sort_addr = sorted(addr_dic.items(), key=lambda item: item[1], reverse=True)[0:10] print(sort_addr) # addr_names = [item[0] for item in sort_addr] # addr_counts = [item[1] for item in sort_addr] # print(addr_names, addr_counts) from pyecharts.charts import Geo from pyecharts.options import LabelOpts, VisualMapOpts, TitleOpts from pyecharts.globals import ChartType geo = Geo() geo.add_schema(maptype="china") geo.add("地点统计", sort_addr, type_=ChartType.EFFECT_SCATTER) geo.set_series_opts(label_opts=LabelOpts(is_show=False)) geo.set_global_opts( visualmap_opts=VisualMapOpts(is_piecewise=True, max_=sort_addr[0][1]), title_opts=TitleOpts(title="撩课Python统计"), ) geo.render("地点统计-geo图.html")
def geo(): place_avaliable = passenger_spider(None, all=True) place_no_weather = passenger_spider_no_weather() city = '上海' g = Geo(init_opts=opts.InitOpts( width="100%", height="100%", bg_color="#12406d")) g.add_schema(maptype=city, itemstyle_opts=opts.ItemStyleOpts(color="#135dbe", border_color="#fff"), zoom=1.2) # 定义坐标对应的名称,添加到坐标库中 add_coordinate(name, lng, lat) for k, v in jingwei_dict.items(): g.add_coordinate(k, float(v[1]), float(v[0])) for item in place_no_weather: g.add_coordinate(item["NAME"], float(item["LOCATION_X"]), float(item["LOCATION_Y"])) coordinates = [] for k in jingwei_dict.keys(): data_pairs = [] data_pairs.append(k) for p in place_avaliable: if k == p["NAME"]: if not p.get("MAX_NUM"): data_pairs.append(0.0) else: data_pairs.append( round(int(p["NUM"]) / int(p["MAX_NUM"]), 2)) break if len(data_pairs) == 1: data_pairs.append(0.0) data_pairs = tuple(data_pairs) coordinates.append(data_pairs) for item in place_no_weather: data_pairs = [] data_pairs.append(item["NAME"]) if (not item["MAX_NUM"]) or (item["MAX_NUM"] == ""): data_pairs.append(0) else: data_pairs.append(round( int(item["NUM"]) / int(item["MAX_NUM"]), 2)) data_pairs = tuple(data_pairs) coordinates.append(data_pairs) # 定义数据对, # data_pair = [ # ('湖南省长沙市雨花区跳马镇仙峰岭', 25), # ('湖南省长沙市宁乡市横市镇藕塘', 5), # ('湖南省长沙市长沙县黄花镇新塘铺长沙黄花国际机场', 20) # ] data_pair = coordinates # Geo 图类型,有 scatter, effectScatter, heatmap, lines 4 种,建议使用 # from pyecharts.globals import GeoType # GeoType.GeoType.EFFECT_SCATTER,GeoType.HEATMAP,GeoType.LINES # 将数据添加到地图上 g.add('', data_pair, type_=ChartType.EFFECT_SCATTER) # 设置样式 g.set_series_opts( label_opts=opts.LabelOpts(is_show=False, formatter="{b}:{c}")) # 自定义分段 color 可以用取色器取色 pieces = [ { 'max': 0.1, 'label': '10%以下', 'color': '#98F5FF' }, { 'min': 0.1, 'max': 0.3, 'label': '10%-30%', 'color': '#0f0' }, { 'min': 0.3, 'max': 0.5, 'label': '30%-50%', 'color': 'orange' }, { 'min': 0.5, 'max': 0.7, 'label': '50%-70%', 'color': '#E2C568' }, { 'min': 0.7, 'max': 0.8, 'label': '70%-80%', 'color': '#FCF84D' }, { 'min': 0.8, 'max': 0.9, 'label': '80%-90%', 'color': '#3700A4' }, { 'min': 0.9, 'max': 1, 'label': '90%-100%', 'color': '#DD675E' }, { 'min': 1, 'label': '100%以上', 'color': '#f00' } # 有下限无上限 ] # is_piecewise 是否自定义分段, 变为true 才能生效 g.set_global_opts( visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=pieces, textstyle_opts=opts.TextStyleOpts( color="#fff"))) return g
("深圳", 1), ("汕头", 1), ("烟台", 1), ("威海", 1), ("芜湖", 1), ("南京", 1), ("温州", 1), ("嘉兴", 1), ], type_=ChartType.EFFECT_SCATTER) c.add( "机场", [ ("北京", 6), ("呼和浩特", 4), ("南昌", 4), ("贵州", 4), ("成都", 4), ("哈尔滨", 2), ("乌鲁木齐", 1), ("郑州", 1), ("沈阳", 2), ("长春", 1), ], type_=ChartType.EFFECT_SCATTER, ) c.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts( title_opts=opts.TitleOpts(title="港口机场分布图"), visualmap_opts=opts.VisualMapOpts(max_=30)) c.render_notebook()
def _cluster(self, up_2, class_upper, plot_matplotlib=False, plot_echarts=False) -> (list, list, list): '''对某个部分进行聚类 class_upper: 表示是否是在所有点的 y 均值之上的点 key: city_index value: 0 or 1 :return 聚好的2类城市的列表 class_0, class_1 另一边的城市列表 (都是不包含起始点的) ''' if up_2: # 找出上面的点进行聚类 cities = [key for key, value in class_upper.items() if value == 1] else: cities = [key for key, value in class_upper.items() if value == 0] try: cities.remove(self.city_start) # 去除起始点 except: pass # todo 将与此部分的点没有联通,但是与另一部分的点有联通的归为另一边(这些点会影响聚类结果,并且不符合业务) should_cluster = deepcopy(self.init_data) # 新的要聚两类中的点组成的无向图 should_not_cluster = dict() other_cities = [] # 另一边的城市 # 分开两边的点 for k, v in class_upper.items(): if k not in cities: other_cities.append(k) should_cluster.pop(k) should_not_cluster[k] = v # 如果一个点的!!所有子结点!!都不在这一部分里,在无向图中删除,并放到另一边 for k, v in list(should_cluster.items()): not_in_sum = 0 for next_node in v: if next_node not in cities: not_in_sum += 1 if not_in_sum == len(v): other_cities.append(k) cities.remove(k) should_cluster.pop(k) should_not_cluster[k] = v arr = [] # 构建二维的数据矩阵 for c in cities: arr.append([*self.map_dict[c]]) data = pd.DataFrame(arr) n_cluster = 2 # km = DBSCAN(eps=1.2, min_samples=3).fit(data) km = KMeans(n_clusters=n_cluster, random_state=6).fit(data) y_pred_ = km.labels_ # 类别预测 print(cities) print(y_pred_) print(other_cities) centroid = km.cluster_centers_ # 聚类中心 # city_class = {i:y_pred_[j] for i, j in zip(data.index, range(0, len(cities)))} # todo 将与自己的类里面无联通,但是与另一个类的点有联通的归为那一类 class_1 = [cities[index] for index, j in enumerate(y_pred_) if j == 1] class_0 = [cities[index] for index, j in enumerate(y_pred_) if j == 0] for c in cities: _sum = 0 out_sum = 0 if c in class_0: c_mark = 0 # c_mark 当前点的类别 else: c_mark = 1 c_list = should_cluster[c] # 单点点对应的子结点列表 for node in c_list: if node not in cities: out_sum += 1 continue node_mark = 0 if node in class_0 else 1 if c_mark != node_mark: _sum += 1 if len(c_list) == _sum + out_sum: if c_mark == 0: class_0.remove(c) class_1.append(c) else: class_1.remove(c) class_0.append(c) if plot_matplotlib: color = ['red', 'blue'] fig, ax1 = plt.subplots(1) y_pred = km.labels_ for i in range(n_cluster): ax1.scatter(data.iloc[y_pred == i, 0], data.iloc[y_pred == i, 1], marker='o', s=50, c=color[i]) ax1.scatter(centroid[:, 0], centroid[:, 1], marker='x', s=50, c='black') plt.savefig('./ttesst.jpg') plt.show() # 不需要聚类那一边的点 # class_another = [x for x in range(0, 17) if x not in class_0 # and x not in class_1].remove(self.city_start) 注意这个列表推导式有毒! # 另一边的点 class_another = [] for x in range(0, 17): if x not in class_0: if x not in class_1: class_another.append(x) # fp = open('./地图可视化.pk', 'wb') # pickle.dump({2:class_0, 5: class_1, 8:class_another}, fp) # f = open('./城市经纬度.pk', 'wb') # pickle.dump(self.map_dict, f) # ff = open('./m_list.pk', 'wb') # pickle.dump(self.m_list, ff) # fp.close() # f.close() # ff.close() if plot_echarts: temp_d = {} d = {2: class_0, 5: class_1, 8: class_another} for key, value in d.items(): for v in value: if v == self.city_start: continue temp_d[self.m_list[v]] = key temp_d[self.m_list[self.city_start]] = 11 g = Geo() g.add_schema(maptype='河南') data_pair = list(temp_d.items()) g.add('', data_pair, type_=GeoType.EFFECT_SCATTER, symbol_size=15) g.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) pieces = [ { 'min': 0, 'max': 3, 'label': '类别1', 'color': '#50A3BA' }, # blue { 'min': 4, 'max': 6, 'label': '类别2', 'color': '#81AE9F' }, # green { 'min': 7, 'max': 8, 'label': '类别3', 'color': '#E2C568' }, # yellow { 'min': 10, 'max': 12, 'label': '起始点', 'color': '#FF8C00' } # orange ] g.set_global_opts( visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=pieces), title_opts=opts.TitleOpts( title=f"物流路径规划-城市聚类-起始点{self.m_list[self.city_start]}"), ) g.render(f'物流路径规划之城市聚类-{self.m_list[self.city_start]}.html') # self.fix_cluster_graph(class_0, class_1, class_another) return class_0, class_1, class_another