gpt4 book ai didi

python - 使用python matplotlib根据点密度绘制颜色网格

转载 作者:行者123 更新时间:2023-12-04 13:36:19 26 4
gpt4 key购买 nike

问题是从文件中读取 10,000 个坐标点,并根据网格上每个块的密度创建一个彩色网格。 x 轴范围为 [-73.59, -73.55],y 轴范围为 [45.49,45.530]。我的代码将绘制具有多种不同颜色的网格,现在我需要一个功能来仅对具有特定密度 n 的网格着色,例如,n = 100,只有具有 100 点或更高点的网格才会被着色为黄色,和其他网格将是黑色的。

我刚刚添加了一个指向我的 shapefile 的链接
https://drive.google.com/open?id=1H-8FhfonnPrYW9y7RQZDtiNLxVEiC6R8

import numpy as np
import matplotlib.pyplot as plt
import shapefile

grid_size = 0.002
x1 = np.arange(-73.59,-73.55,grid_size)
y1 = np.arange(45.49,45.530,grid_size)
shape = shapefile.Reader("Shape/crime_dt.shp",encoding='ISO-8859-1')
shapeRecords = shape.shapeRecords()

x_coordinates=[]
y_coordinates=[]

# read all points in .shp file, and store them in 2 lists.
for k in range(len(shapeRecords)):
x = float(shapeRecords[k].shape.__geo_interface__["coordinates"][0])
y = float(shapeRecords[k].shape.__geo_interface__["coordinates"][1])
x_coordinates.append(x)
y_coordinates.append(y)

plt.hist2d(x_coordinates,y_coordinates,bins=[x1,y1])
plt.show()

最佳答案

您可以创建仅包含两种颜色的颜色图,并将 vmin 和 vmax 设置为围绕所需的枢轴值对称。

您可以选择将每个 bin 的值放在单元格内,而枢轴值决定文本颜色。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

grid_size = 0.002
x1 = np.arange(-73.59, -73.55, grid_size)
y1 = np.arange(45.49, 45.530, grid_size)

# read coordinates from file and put them into two lists, similar to this
x_coordinates = np.random.uniform(x1.min(), x1.max(), size=40000)
y_coordinates = np.random.uniform(y1.min(), y1.max(), size=40000)
pivot_value = 100
# create a colormap with two colors, vmin and vmax are chosen so that their center is the pivot value
cmap = ListedColormap(['indigo', 'gold'])
# create a 2d histogram with xs and ys as bin boundaries
binvalues, _, _, _ = plt.hist2d(x_coordinates, y_coordinates, bins=[x1, y1], cmap=cmap, vmin=0, vmax=2*pivot_value)
binvalues = binvalues.astype(np.int)
for i in range(len(x1) - 1):
for j in range(len(y1) - 1):
plt.text((x1[i] + x1[i + 1]) / 2, (y1[j] + y1[j + 1]) / 2, binvalues[i, j],
color='white' if binvalues[i, j] < pivot_value else 'black',
ha='center', va='center', size=8)
plt.show()

example plot

PS:如果 bin 值非常重要,您可以将它们全部添加为刻度。然后,它们的位置也可用于绘制网格线作为单元格之间的分隔。

plt.yticks(y1)
plt.xticks(x1, rotation=90)
plt.grid(True, ls='-', lw=1, color='black')

要根据这些数据获取轮廓,您可以 plt.contourf与生成的矩阵。 (您可能希望使用 np.histogram2d 直接创建矩阵。)

plt.contourf((x1[1:]+x1[:-1])/2, (y1[1:]+y1[:-1])/2, binvalues.T, levels=[0,100,1000], cmap=cmap)

contour plot

关于python - 使用python matplotlib根据点密度绘制颜色网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61736689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com