Как исказить шестиугольные плитки на графике x,y, используя боке HexTile

Я пытаюсь создать шестнадцатеричную карту парламентских округов Великобритании в python, используя функцию HexTile библиотеки Bokeh. Я пытаюсь подражать шестнадцатеричной карте Leeds ODI (https://odileeds.org/projects/hexmaps/constituencies/) и использовали систему координат q r, указанную в загружаемом файле .hexjson.

Однако мой сюжет выглядит искаженным.

Я знаю, что система координат q r, которую мы использовали в функции Bokeh HexTile, может отличаться от той, которая используется в 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, влево, а всего, что выше, вправо. Тем не менее, я пробовал ряд преобразований, но ни одно из них не дало желаемого результата.

Желаемый результат похож на ссылку ODI в Лидсе.

введите здесь описание изображения


person Geodatsci    schedule 13.08.2019    source источник


Ответы (1)


Если вы посмотрите на это изображение из документов Bokeh:

введите здесь описание изображения

Вы можете видеть, что ось «q = 0» идет вверх и влево. К сожалению, существуют разные соглашения, и в некоторых системах есть ось "q=0", которая идет вверх и вправо. Я думаю, что для преобразования вам нужно последовательно добавить 1 к значению q для каждой строки в ваших данных, т.е. q+=1 для всех гексов в первой строке, затем q+=2 для всех гексов во второй строке и т. д., включая учет и «отсутствующие» строки данных (хотя у вас их нет в вашем конкретном наборе данных).

Предполагая, что это работает, пожалуйста, откройте вопрос на GitHub, возможно, мы сможем предоставить какой-то адаптер для эта ситуация.

person bigreddot    schedule 13.08.2019
comment
Спасибо, я думал, что это как-то связано с этим. Разве это не было бы на самом деле r+=1 вместо этого? Поскольку мне нужно наклонять вещи влево и вправо, а не в направлении оси «q». Кроме того, как мне написать это в коде? Я не уверен, как получить доступ к номеру строки. - person Geodatsci; 13.08.2019
comment
Посмотрите на красный шестиугольник (q,r) = (0, -1) выше. Вы хотите, чтобы он переместился на одну позицию вправо. То есть быть на уровне (1,-1), что равносильно добавлению 1 к значению q. Что касается того, как это сделать, вам нужно будет просмотреть все значения в source.data['q'] и source.data['r']. Каждое отдельное значение r соответствует строке. Начиная с наименьшего значения r вам нужно добавить N к каждому значению q в этом r. (Где N увеличивается с каждой последующей строкой) - person bigreddot; 13.08.2019
comment
Другой подход может состоять в том, чтобы начать раньше, с DataFrame. Вы могли бы потенциально сгруппировать по r, а затем добавить правильное смещение к значениям q в каждой группе. (Мои панды недостаточно опытны, чтобы сделать больше, чем просто предложить идею) - person bigreddot; 13.08.2019
comment
Спасибо за это. Я думаю, что мне потребуется вручную отредактировать значения q. Я пытался найти глобальную трансформацию, но не смог ее найти. Спасибо еще раз за помощь. - person Geodatsci; 14.08.2019
comment
Я попробовал несколько вещей, и следующее сработало. Я взял значения r для каждой гексагональной плитки и сопоставил их с числом, которое нужно было добавить к значению q с помощью словаря. {17:0, 16:1, 15:1, 15:2, 14:2, 13:3, 12:3, 11:4, 10:4, 9:5, 8:5, 7:6, 6:6, 5:7, 4:7, 3:8, 2:8, 1:9, 0:9, -1:10, -2:10, -3:11, -4:11, -5:12, -6:12, -7:13, -8:13, -9:14, -10:14, -11:15, -12:15, -13:16, -14:16, -15:17, -16:17, -17:18, -18:18, -19:19, -20:19, -21:20, -22:20, -23:21, -24:21, -25:22, -26:22, -27:23, -28:23} - person Geodatsci; 14.08.2019