使用seaborn在python中绘制3列的热图

2023-11-24

v1      v2      yy
15.25   44.34   100.00
83.05   59.78   100.00
96.61   65.09   100.00
100.00  75.47   100.00
100.00  50.00   100.00
100.00  68.87   100.00
100.00  79.35   100.00
100.00  100.00  100.00
100.00  63.21   100.00
100.00  100.00  100.00
100.00  68.87   100.00
0.00    56.52   92.86
10.17   52.83   92.86
23.73   46.23   92.86

在上面的数据框中,我想使用 v1 和 v2 作为 x 和 y 轴,并使用 yy 作为值来绘制热图。我怎样才能在Python中做到这一点?我尝试过seaborn:

df = df.pivot('v1', 'v2', 'yy')
ax = sns.heatmap(df)

然而,这是行不通的。还有其他解决方案吗?


一个海生heatmap绘制分类数据。这意味着每个出现的值将在热图中占据与任何其他值相同的空间,而与它们在数字上分开的距离无关。对于数值数据来说,这通常是不希望的。相反,可以选择以下技术之一。

Scatter

彩色散点图可能和热图一样好。点的颜色代表yy value.

ax.scatter(df.v1, df.v2, c=df.yy,  cmap="copper")

enter image description here

u = u"""v1      v2      yy
15.25   44.34   100.00
83.05   59.78   100.00
96.61   65.09   100.00
100.00  75.47   100.00
100.00  50.00   100.00
100.00  68.87   100.00
100.00  79.35   100.00
100.00  100.00  100.00
100.00  63.21   100.00
100.00  100.00  100.00
100.00  68.87   100.00
0.00    56.52   92.86
10.17   52.83   92.86
23.73   46.23   92.86"""

import pandas as pd
import matplotlib.pyplot as plt
import io

df = pd.read_csv(io.StringIO(u), delim_whitespace=True )

fig, ax = plt.subplots()

sc = ax.scatter(df.v1, df.v2, c=df.yy,  cmap="copper")

fig.colorbar(sc, ax=ax)

ax.set_aspect("equal")


plt.show()

Hexbin

您可能想了解一下hexbin。数据将显示在六边形箱中,并且数据将聚合为每个箱内的平均值。这里的优点是,如果您选择较大的网格大小,它将看起来像散点图,而如果您将网格大小设置得很小,它看起来像热图,可以轻松地将绘图调整到所需的分辨率。

h1 = ax.hexbin(df.v1, df.v2, C=df.yy, gridsize=100, cmap="copper")
h2 = ax2.hexbin(df.v1, df.v2, C=df.yy, gridsize=10, cmap="copper")

enter image description here

u = u"""v1      v2      yy
15.25   44.34   100.00
83.05   59.78   100.00
96.61   65.09   100.00
100.00  75.47   100.00
100.00  50.00   100.00
100.00  68.87   100.00
100.00  79.35   100.00
100.00  100.00  100.00
100.00  63.21   100.00
100.00  100.00  100.00
100.00  68.87   100.00
0.00    56.52   92.86
10.17   52.83   92.86
23.73   46.23   92.86"""

import pandas as pd
import matplotlib.pyplot as plt
import io

df = pd.read_csv(io.StringIO(u), delim_whitespace=True )

fig, (ax, ax2) = plt.subplots(nrows=2)

h1 = ax.hexbin(df.v1, df.v2, C=df.yy, gridsize=100, cmap="copper")
h2 = ax2.hexbin(df.v1, df.v2, C=df.yy, gridsize=10, cmap="copper")

fig.colorbar(h1, ax=ax)
fig.colorbar(h2, ax=ax2)
ax.set_aspect("equal")
ax2.set_aspect("equal")
ax.set_title("gridsize=100")
ax2.set_title("gridsize=10")
fig.subplots_adjust(hspace=0.3)
plt.show()

Tripcolor

A tripcolorplot 可用于根据数据点获取图中的彩色区域,然后将其解释为三角形的边缘,并根据边缘点的数据进行着色。这样的图需要有更多可用数据才能给出有意义的表示。

ax.tripcolor(df.v1, df.v2, df.yy,  cmap="copper")

enter image description here

u = u"""v1      v2      yy
15.25   44.34   100.00
83.05   59.78   100.00
96.61   65.09   100.00
100.00  75.47   100.00
100.00  50.00   100.00
100.00  68.87   100.00
100.00  79.35   100.00
100.00  100.00  100.00
100.00  63.21   100.00
100.00  100.00  100.00
100.00  68.87   100.00
0.00    56.52   92.86
10.17   52.83   92.86
23.73   46.23   92.86"""

import pandas as pd
import matplotlib.pyplot as plt
import io

df = pd.read_csv(io.StringIO(u), delim_whitespace=True )

fig, ax = plt.subplots()

tc = ax.tripcolor(df.v1, df.v2, df.yy,  cmap="copper")

fig.colorbar(tc, ax=ax)

ax.set_aspect("equal")
ax.set_title("tripcolor")

plt.show()

请注意,一个tricontourf如果整个网格中有更多数据点可用,则绘图可能同样适合。

ax.tricontourf(df.v1, df.v2, df.yy,  cmap="copper")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用seaborn在python中绘制3列的热图 的相关文章

随机推荐