我有一个在csv文件中读取的代码,其中包含地点、纬度和经度,以及我是否去过那里(用“Y”或“N”标记)。我想在Voronoi图中展示这一点,但至关重要的是,我想根据以下标准对区域进行着色:
我的代码有两个问题:我似乎无法将Voronoi(coords)
生成的区域与我的原始位置列表相匹配(因此我无法将区域与我要填充该区域的颜色对应起来,因为区域的定义和填充顺序与它们在数据框中的出现顺序不同),其次,如何确保每个随机颜色“唯一”,即每个区域中出现的随机颜色不同
第二个问题我很确定我能找到解决方案,这是我正在努力解决的第一个问题。任何帮助都将不胜感激。这是我的密码:
import pandas as pd
from scipy.spatial import Voronoi, voronoi_plot_2d
import numpy as np
# read places, with lat and lon
places = pd.read_csv("places.csv")
# convert subset to numpy array
coords = places[['Longitude','Latitude']].values
# add 4 distant dummy points
coords = np.append(coords, [[999,999], [-999,999], [999,-999], [-999,-999]], axis = 0)
colours = np.append(places[['Been']].values, [['N'], ['N'], ['N'], ['N']], axis = 0).flatten()
colours = np.insert(colours, 0, ['N','N'])
# assign a random colour to the array if visited, leave white if not
colours[colours == 'N'] = 'w'
import random
r = lambda: random.randint(0,255)
colours[colours == 'Y'] = '#%02X%02X%02X' % (r(),r(),r())
print(places['Place'])
print(colours)
print(coords)
# compute voronoi tesselation
vor = Voronoi(coords)
# plot voronoi diagram
import matplotlib.pyplot as plt
fig = voronoi_plot_2d(vor, show_vertices = False)
j = -1
# colourise the regions
for region in vor.regions:
j = j+1
print(region)
if not -1 in region:
polygon = [vor.vertices[i] for i in region]
plt.fill(*zip(*polygon), colours[j])
# fix the range of axes, plot locations
plt.plot(coords[:,0], coords[:,1], 'ko')
plt.xlim([places['Longitude'].min() - 0.6, places['Longitude'].max() + 0.6]), plt.ylim([places['Latitude'].min() - 0.6, places['Latitude'].max() + 0.6])
# annotate each point with the place name
[plt.annotate(places['Place'][i], (coords[i,0], coords[i,1]), xytext=(coords[i,0]-0.2, coords[i,1]+0.2)) for i in range(len(places))]
plt.show()
我在Jupyter笔记本上制作了这个。我的csv文件如下所示:
Place,Latitude,Longitude,Been
Bern,46.948,7.4474,N
Juras,47.0086,6.7856,N
Lake Como,46.016,9.2572,N
Lyon,45.764,4.8357,N
Marseille,43.2965,5.3698,N
Milan,45.4642,9.19,N
Monaco,43.7384,7.4246,N
Mont Blanc,45.8326,6.8652,N
Mont Saleve,46.0942,6.1403,Y
Munich,48.1351,11.582,N
Turin,45.0703,7.6869,N
Zurich,47.3769,8.5417,N
如果有帮助的话,我已经在print语句中留下了一些注释行代码。我现在给里昂标记的区域涂上颜色,这表明我不知道如何使用region in vor.regions
检索它对应的坐标。提前谢谢
您需要使用结果Voronoi结果的point_region属性来确定哪个输入点对应于哪个Voronoi区域。以下是显示区域颜色的更新代码
我更新了代码,为每个彩色Voronoi区域提供了不同的随机颜色。代码如下:
这是我制作的一个绘图,为原始文件中的一些行添加了颜色:
相关问题 更多 >
编程相关推荐