在Bokeh中,如何显示点和面片的不同信息?

2024-04-25 23:46:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用bokeh显示不同层(点和面片)的不同信息。你知道吗

我分别从herehere下载了海地城市的形状文件和人口信息,并对它们进行了合并。你知道吗

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import geopandas as gpd

import osmnx as ox

from bokeh.layouts import row, column
from bokeh.models import Select
from bokeh.palettes import Spectral5
from bokeh.plotting import curdoc, figure, save
from bokeh.sampledata.autompg import autompg_clean as df


from bokeh.io import show
from bokeh.models import LogColorMapper
from bokeh.palettes import Viridis6 as palette
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource

from bokeh.sampledata.us_counties import data as counties
from bokeh.sampledata.unemployment import data as unemployment

import pandas as pd
import geopandas as gpd
import shapely

color_mapper = LogColorMapper(palette=palette)

一些功能

 def getPolyCoords(row, geom, coord_type):
        """Returns the coordinates ('x' or 'y') of edges of a Polygon exterior"""

        # Parse the exterior of the coordinate
        exterior = row[geom].exterior

        if coord_type == 'x':
            # Get the x coordinates of the exterior
            return list( exterior.coords.xy[0] )
        elif coord_type == 'y':
            # Get the y coordinates of the exterior
            return list( exterior.coords.xy[1] )
def getPointCoords(row, geom, coord_type):
    """Calculates coordinates ('x' or 'y') of a Point geometry"""
    if coord_type == 'x':
        return row[geom].x
    elif coord_type == 'y':
        return row[geom].y

城市数据

haiti = gpd.read_file(hti_admbnda_adm2_cnigs_20181129.shp')
haiti = haiti.to_crs({'init': 'epsg:32618'})
haiti = haiti[haiti.index != 98].reset_index(drop=True) ## i=98 is corrupted

pop = pd.read_csv('hti_admnbnda_adm2_cnigs2013c.csv')
level = 2
left = 'adm%dcode'%level
right = 'ADM%d_PCODE'%level
h_geom = pd.merge(pop, haiti, left_on=left, right_on=right)

然后我为bokeh创建了一个数据

grid = pd.DataFrame()
grid['x'] = h_geom.apply(getPolyCoords, geom='geometry', coord_type='x', axis=1)
grid['y'] = h_geom.apply(getPolyCoords, geom='geometry', coord_type='y', axis=1)
grid['Name'] = h_geom['adm2_en']
grid['Population'] = h_geom['TOTAL']
data=dict(
    x=list(grid['x'].values),
    y=list(grid['y'].values),
    name=list(grid['Name'].values),
    rate=list(grid['Population'].values),
)

osmnx我得到了学校的分数

selected_amenities = ['school']
place = 'Haiti'
schoolOSM = ox.pois_from_place(place=place, amenities=selected_amenities)
schools = gpd.GeoDataFrame(schoolOSM)
idxok = []
for i in schools.index:
    if type(schools['geometry'][i]) == shapely.geometry.point.Point:
        idxok.append(i)
schools = schools[schools.index.isin(idxok)]
schools['x'] = schools.apply(getPointCoords, geom='geometry', coord_type='x', axis=1)
schools['y'] = schools.apply(getPointCoords, geom='geometry', coord_type='y', axis=1)

data1=dict(
    x=list(schools['x'].values),
    y=list(schools['y'].values),
)

然后我想显示信息:我想显示城市的名称、人口和坐标,而只显示学校的坐标。你知道吗

TOOLS = "pan,wheel_zoom,reset,hover,save"

p = figure(title="Schools Point in Haiti", tools=TOOLS,
    x_axis_location=None, y_axis_location=None,
    tooltips=[("Name", "@name"), ("Population", "@rate"), ("(Long, Lat)", "($x, $y)")])

p.hover.point_policy = "follow_mouse"
p.patches('x', 'y', source=data,
         fill_color={'field': 'rate', 'transform': color_mapper},
         fill_alpha=1.0, line_color="black", line_width=1)
# Add points on top (as black points)
p.circle('x', 'y', size=3, source=data1, color="black")

show(p)

这样我就得到了学校和城市的NamePopulationLongLat信息。但是学校没有信息NamePopulation,所以我得到

enter image description here


Tags: thefromimportastypebokehlistgrid
1条回答
网友
1楼 · 发布于 2024-04-25 23:46:38

您需要创建两个单独的数据源和两个单独的工具。你知道吗

from bokeh.models import HoverTool

data_cities = dict(x = list(cities['x'].values),  y = list(cities['y'].values))
data_schools = dict(x = list(schools['x'].values),  y = list(schools['y'].values))

cities = p.circle('x', 'y', size = 3, source = data_cities, color = "green")
schools = p.circle('x', 'y', size = 3, source = data_schools, color = "blue")

hover_cities = HoverTool(renderers = [cities], tooltips = [("Name", "@name"), ("Population", "@rate"), ("(Long, Lat)", "($x, $y)")]))
hover_schools = HoverTool(renderers = [schools], tooltips = [("(Long, Lat)", "($x, $y)")]))

p.add_tools(hover_cities)
p.add_tools(hover_schools)

相关问题 更多 >

    热门问题