使用坐标点生成热图
Heat map generation using coordinate points
我是 Python 的新人。我的问题的答案可能在 Whosebug 中可用,但老实说,我几乎尝试了 Whosebug 中可用的所有代码和建议。
我的问题:和描述的差不多。我有坐标点(x
和 y
)和相应的值(p
)作为 .csv
文件。我正在使用 pandas
.
读取该文件
df = pd.read_csv("example.csv")
example.csv
文件可以从 here 下载。让一个大小为 2000 x 2000
的图像。
任务:
根据 excel sheet 中的 x
和 y
坐标点,我必须找到该图像中的点。
让我们,A
是图像,A(x,y)
是 A
内的任意点。现在我必须以这样的方式生成热图,以便 x
中的 50 个像素和 y
中的 50 个像素,即 A(x,y), A(x+50, y), A (x, y+50) 和 A(x+50, y+50) 包含对应于该坐标点的 p
。
我发现 这对我的问题很有帮助,但问题是我的数据集需要进行更多修改。
上面可用的代码link:
#!/usr/bin/python3
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from skimage import io
from skimage.color import rgb2gray
import matplotlib as mpl
# Read original image
img = io.imread('img.jpg')
# Get the dimensions of the original image
x_dim, y_dim, z_dim = np.shape(img)
# Create heatmap
heatmap = np.zeros((x_dim, y_dim), dtype=float)
# Read CSV with a Pandas DataFrame
df = pd.read_csv("data.csv")
# Set probabilities values to specific indexes in the heatmap
for index, row in df.iterrows():
x = np.int(row["x"])
y = np.int(row["y"])
x1 = np.int(row["x1"])
y1 = np.int(row["y1"])
p = row["Probability value"]
heatmap[x:x1,y:y1] = p
# Plot images
fig, axes = plt.subplots(1, 2, figsize=(8, 4))
ax = axes.ravel()
ax[0].imshow(img)
ax[0].set_title("Original")
fig.colorbar(ax[0].imshow(img), ax=ax[0])
ax[1].imshow(img, vmin=0, vmax=1)
ax[1].imshow(heatmap, alpha=.5, cmap='jet')
ax[1].set_title("Original + heatmap")
# Specific colorbar
norm = mpl.colors.Normalize(vmin=0,vmax=2)
N = 11
cmap = plt.get_cmap('jet',N)
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array([])
plt.colorbar(sm, ticks=np.linspace(0,1,N),
boundaries=np.arange(0,1.1,0.1))
fig.tight_layout()
plt.show()
我在使用这段代码时遇到的问题:
此代码正在生成方形边缘的热图,但我希望边缘平滑。我知道高斯分布可能会解决这个问题。但是我是 python 的新手,我不知道如何在我的数据集中实现高斯分布。
不属于坐标点的区域也生成一层颜色。作为覆盖图像的结果,那些层覆盖了原始图像的背景。一句话,我希望热图的背景是透明的,这样叠加层就不会在显示未被坐标点覆盖的区域时产生任何问题。
任何线索将不胜感激。
您链接的问题使用了 plotly。如果您不想使用它并且只想简单地平滑数据的外观,我建议只使用使用 scipy.
的高斯滤波器
在顶部,导入:
import seaborn as sns
from scipy.ndimage.filters import gaussian_filter
然后像这样使用它:
df_smooth = gaussian_filter(df, sigma=1)
sns.heatmap(df_smooth, vmin=-40, vmax=150, cmap ="coolwarm" , cbar=True , cbar_kws={"ticks":[-40,150,-20,0,25,50,75,100,125]})
您可以更改平滑量,例如使用sigma=3,或任何其他可提供所需平滑量的数字。
请记住,这也会 "smooth out" 您拥有的任何最大数据峰值,因此您的最小和最大数据将不再与您在规范化中指定的相同。为了仍然获得好看的热图,我建议不要为您的 vmin 和 vmax 使用固定值,但是:
sns.heatmap(df_smooth, vmin=np.min(df_smooth), vmax=np.max(df_smooth), cmap ="coolwarm" , cbar=True , cbar_kws={"ticks":[-40,150,-20,0,25,50,75,100,125]})
如果您的高斯滤波器满足您提到的期望,您甚至可以直接对数据实施高斯归一化。
你的代码很完美。只需更改一行,那么您的两个问题都将得到解决。
更改前:
ax[1].imshow(heatmap, alpha=.5, cmap='jet')
修改后:
ax[1].imshow(heatmap, alpha=.5, cmap='coolwarm', interpolation='gaussian')
虽然上述更改会解决您的问题,但如果您想要提高透明度,可以使用以下功能
def transparent_cmap(cmap, N=255):
"Copy colormap and set alpha values"
mycmap = cmap
mycmap._init()
mycmap._lut[:,-1] = np.linspace(0, 0.8, N+4)
return mycmap
mycmap = transparent_cmap(plt.cm.coolwarm)
在这种情况下,您之前的代码行将更改如下:
ax[1].imshow(heatmap, alpha=.5, cmap=mycmap, vmin=0, vmax=1)
我是 Python 的新人。我的问题的答案可能在 Whosebug 中可用,但老实说,我几乎尝试了 Whosebug 中可用的所有代码和建议。
我的问题:和描述的差不多x
和 y
)和相应的值(p
)作为 .csv
文件。我正在使用 pandas
.
df = pd.read_csv("example.csv")
example.csv
文件可以从 here 下载。让一个大小为 2000 x 2000
的图像。
任务:
根据 excel sheet 中的 x
和 y
坐标点,我必须找到该图像中的点。
让我们,A
是图像,A(x,y)
是 A
内的任意点。现在我必须以这样的方式生成热图,以便 x
中的 50 个像素和 y
中的 50 个像素,即 A(x,y), A(x+50, y), A (x, y+50) 和 A(x+50, y+50) 包含对应于该坐标点的 p
。
我发现
上面可用的代码link:
#!/usr/bin/python3
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from skimage import io
from skimage.color import rgb2gray
import matplotlib as mpl
# Read original image
img = io.imread('img.jpg')
# Get the dimensions of the original image
x_dim, y_dim, z_dim = np.shape(img)
# Create heatmap
heatmap = np.zeros((x_dim, y_dim), dtype=float)
# Read CSV with a Pandas DataFrame
df = pd.read_csv("data.csv")
# Set probabilities values to specific indexes in the heatmap
for index, row in df.iterrows():
x = np.int(row["x"])
y = np.int(row["y"])
x1 = np.int(row["x1"])
y1 = np.int(row["y1"])
p = row["Probability value"]
heatmap[x:x1,y:y1] = p
# Plot images
fig, axes = plt.subplots(1, 2, figsize=(8, 4))
ax = axes.ravel()
ax[0].imshow(img)
ax[0].set_title("Original")
fig.colorbar(ax[0].imshow(img), ax=ax[0])
ax[1].imshow(img, vmin=0, vmax=1)
ax[1].imshow(heatmap, alpha=.5, cmap='jet')
ax[1].set_title("Original + heatmap")
# Specific colorbar
norm = mpl.colors.Normalize(vmin=0,vmax=2)
N = 11
cmap = plt.get_cmap('jet',N)
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array([])
plt.colorbar(sm, ticks=np.linspace(0,1,N),
boundaries=np.arange(0,1.1,0.1))
fig.tight_layout()
plt.show()
我在使用这段代码时遇到的问题:
此代码正在生成方形边缘的热图,但我希望边缘平滑。我知道高斯分布可能会解决这个问题。但是我是 python 的新手,我不知道如何在我的数据集中实现高斯分布。
不属于坐标点的区域也生成一层颜色。作为覆盖图像的结果,那些层覆盖了原始图像的背景。一句话,我希望热图的背景是透明的,这样叠加层就不会在显示未被坐标点覆盖的区域时产生任何问题。
任何线索将不胜感激。
您链接的问题使用了 plotly。如果您不想使用它并且只想简单地平滑数据的外观,我建议只使用使用 scipy.
的高斯滤波器在顶部,导入:
import seaborn as sns
from scipy.ndimage.filters import gaussian_filter
然后像这样使用它:
df_smooth = gaussian_filter(df, sigma=1)
sns.heatmap(df_smooth, vmin=-40, vmax=150, cmap ="coolwarm" , cbar=True , cbar_kws={"ticks":[-40,150,-20,0,25,50,75,100,125]})
您可以更改平滑量,例如使用sigma=3,或任何其他可提供所需平滑量的数字。
请记住,这也会 "smooth out" 您拥有的任何最大数据峰值,因此您的最小和最大数据将不再与您在规范化中指定的相同。为了仍然获得好看的热图,我建议不要为您的 vmin 和 vmax 使用固定值,但是:
sns.heatmap(df_smooth, vmin=np.min(df_smooth), vmax=np.max(df_smooth), cmap ="coolwarm" , cbar=True , cbar_kws={"ticks":[-40,150,-20,0,25,50,75,100,125]})
如果您的高斯滤波器满足您提到的期望,您甚至可以直接对数据实施高斯归一化。
你的代码很完美。只需更改一行,那么您的两个问题都将得到解决。
更改前:
ax[1].imshow(heatmap, alpha=.5, cmap='jet')
修改后:
ax[1].imshow(heatmap, alpha=.5, cmap='coolwarm', interpolation='gaussian')
虽然上述更改会解决您的问题,但如果您想要提高透明度,可以使用以下功能
def transparent_cmap(cmap, N=255):
"Copy colormap and set alpha values"
mycmap = cmap
mycmap._init()
mycmap._lut[:,-1] = np.linspace(0, 0.8, N+4)
return mycmap
mycmap = transparent_cmap(plt.cm.coolwarm)
在这种情况下,您之前的代码行将更改如下:
ax[1].imshow(heatmap, alpha=.5, cmap=mycmap, vmin=0, vmax=1)