如何使用 bokeh HexTile 在 x,y 图上倾斜六角形图块
How to skew hexagonal tiles on an x,y graph, using bokeh HexTile
我正在尝试使用 Bokeh 库的 HexTile 功能在 python 中创建英国议会选区的六边形地图。我正在尝试模拟 Leeds ODI hexmap (https://odileeds.org/projects/hexmaps/constituencies/),并使用了可下载的 .hexjson 文件中提供的 q r 坐标系。
然而,我的情节看起来有偏差。
我知道我们在 Bokeh HexTile 功能中使用的 q r 坐标系可能与 Leeds ODI 使用的坐标系不同。因此,为什么我像以前一样以一个奇怪的角度绘制了 r 值。
from bokeh.models import ColumnDataSource, Plot, LinearAxis, Grid, HoverTool
from bokeh.models.glyphs import HexTile
from bokeh.io import curdoc, show
import pandas as pd
df = pd.read_csv('/Users/georgefry/Documents/data_science/uk_pol/hex_map/cons_hex_coords.csv')
df['r'] = df['r'] * -1
df['q'] = df['q']
source = ColumnDataSource(df)
hover = HoverTool(tooltips=[('Code', '@code')])
plot = Plot(
title=None, plot_width=300, plot_height=300,
min_border=0, toolbar_location=None, tools=[hover])
glyph = HexTile(q="q", r="r", size=1, fill_color="#fb9a99", line_color="white")
plot.add_glyph(source, glyph)
xaxis = LinearAxis()
plot.add_layout(xaxis, 'below')
yaxis = LinearAxis()
plot.add_layout(yaxis, 'left')
plot.add_layout(Grid(dimension=1, ticker=xaxis.ticker))
plot.add_layout(Grid(dimension=0, ticker=yaxis.ticker))
curdoc().add_root(plot)
show(plot)
我很欣赏这既是一个几何问题,也是一个特定于散景的问题。我也知道,可以通过逐渐将 y 轴上原点以下的所有内容向左倾斜,并将上方的所有内容向右倾斜来找到解决方案。但是,我尝试了一些转换,但其中 none 产生了预期的结果。
期望的结果类似于 Leeds ODI link。
如果您查看 Bokeh 文档中的这张图片:
您可以看到 "q=0" 轴向左上方移动。不幸的是,有不同的约定,有些系统有一个 "q=0" 轴向上和 右边 。我认为要进行转换,您需要 成功地 将数据中每一行的 q 值加 1,即第一行中所有十六进制的 q+=1
,然后 q+=2
对于第二行中的所有六边形,等等...包括考虑和 "missing" 行数据(尽管您的特定数据集中似乎没有任何数据)。
如果可行,请open an issue on GitHub,也许我们可以为这种情况提供某种适配器。
我正在尝试使用 Bokeh 库的 HexTile 功能在 python 中创建英国议会选区的六边形地图。我正在尝试模拟 Leeds ODI hexmap (https://odileeds.org/projects/hexmaps/constituencies/),并使用了可下载的 .hexjson 文件中提供的 q r 坐标系。
然而,我的情节看起来有偏差。
我知道我们在 Bokeh HexTile 功能中使用的 q r 坐标系可能与 Leeds ODI 使用的坐标系不同。因此,为什么我像以前一样以一个奇怪的角度绘制了 r 值。
from bokeh.models import ColumnDataSource, Plot, LinearAxis, Grid, HoverTool
from bokeh.models.glyphs import HexTile
from bokeh.io import curdoc, show
import pandas as pd
df = pd.read_csv('/Users/georgefry/Documents/data_science/uk_pol/hex_map/cons_hex_coords.csv')
df['r'] = df['r'] * -1
df['q'] = df['q']
source = ColumnDataSource(df)
hover = HoverTool(tooltips=[('Code', '@code')])
plot = Plot(
title=None, plot_width=300, plot_height=300,
min_border=0, toolbar_location=None, tools=[hover])
glyph = HexTile(q="q", r="r", size=1, fill_color="#fb9a99", line_color="white")
plot.add_glyph(source, glyph)
xaxis = LinearAxis()
plot.add_layout(xaxis, 'below')
yaxis = LinearAxis()
plot.add_layout(yaxis, 'left')
plot.add_layout(Grid(dimension=1, ticker=xaxis.ticker))
plot.add_layout(Grid(dimension=0, ticker=yaxis.ticker))
curdoc().add_root(plot)
show(plot)
我很欣赏这既是一个几何问题,也是一个特定于散景的问题。我也知道,可以通过逐渐将 y 轴上原点以下的所有内容向左倾斜,并将上方的所有内容向右倾斜来找到解决方案。但是,我尝试了一些转换,但其中 none 产生了预期的结果。
期望的结果类似于 Leeds ODI link。
如果您查看 Bokeh 文档中的这张图片:
您可以看到 "q=0" 轴向左上方移动。不幸的是,有不同的约定,有些系统有一个 "q=0" 轴向上和 右边 。我认为要进行转换,您需要 成功地 将数据中每一行的 q 值加 1,即第一行中所有十六进制的 q+=1
,然后 q+=2
对于第二行中的所有六边形,等等...包括考虑和 "missing" 行数据(尽管您的特定数据集中似乎没有任何数据)。
如果可行,请open an issue on GitHub,也许我们可以为这种情况提供某种适配器。