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

use*_*827 8 python matplotlib heatmap pandas seaborn

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
Run Code Online (Sandbox Code Playgroud)

在上面的数据框中,我想绘制一个热图,使用v1和v2作为x和y轴,yy作为值.我怎么能在python中做到这一点?我试过seaborn:

df = df.pivot('v1', 'v2', 'yy')
ax = sns.heatmap(df)
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.还有其他方法吗?

Imp*_*est 7

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

Scatter

彩色散点图可能与热图一样好.点的颜色代表yy值.

ax.scatter(df.v1, df.v2, c=df.yy,  cmap="copper")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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()
Run Code Online (Sandbox Code Playgroud)

Hexbin

你可能想要研究一下hexbin.数据将以六边形箱显示,数据汇总为每个箱内的平均值.这里的优点是,如果你选择gridsize large,它看起来就像一个散点图,而如果你把它做得很小,它看起来像一个热图,可以很容易地将图调整到所需的分辨率.

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")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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()
Run Code Online (Sandbox Code Playgroud)

Tripcolor

tripcolor情节可用于根据数据点,然后将其解释为三角形的边中的情节,得到有色reagions,根据edgepoints'数据着色.这样的情节需要有更多的数据来提供有意义的表示.

ax.tripcolor(df.v1, df.v2, df.yy,  cmap="copper")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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()
Run Code Online (Sandbox Code Playgroud)

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

ax.tricontourf(df.v1, df.v2, df.yy,  cmap="copper")
Run Code Online (Sandbox Code Playgroud)


Ser*_*ity 6

您的数据具有重复值的问题,例如:

100.00  100.00  100.00
100.00  100.00  100.00
Run Code Online (Sandbox Code Playgroud)

您必须删除重复的值,然后像这样进行透视和绘图:

import seaborn as sns
import pandas as pd

# fill data

df = pd.read_clipboard()
df.drop_duplicates(['v1','v2'], inplace=True)
pivot = df.pivot(index='v1', columns='v2', values='yy')
ax = sns.heatmap(pivot,annot=True)
plt.show()

print (pivot)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

枢:

v2      44.34   46.23   50.00   52.83   56.52   59.78   63.21   65.09   \
v1                                                                       
0.00       NaN     NaN     NaN     NaN   92.86     NaN     NaN     NaN   
10.17      NaN     NaN     NaN   92.86     NaN     NaN     NaN     NaN   
15.25    100.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
23.73      NaN   92.86     NaN     NaN     NaN     NaN     NaN     NaN   
83.05      NaN     NaN     NaN     NaN     NaN   100.0     NaN     NaN   
96.61      NaN     NaN     NaN     NaN     NaN     NaN     NaN   100.0   
100.00     NaN     NaN   100.0     NaN     NaN     NaN   100.0     NaN   

v2      68.87   75.47   79.35   100.00  
v1                                      
0.00       NaN     NaN     NaN     NaN  
10.17      NaN     NaN     NaN     NaN  
15.25      NaN     NaN     NaN     NaN  
23.73      NaN     NaN     NaN     NaN  
83.05      NaN     NaN     NaN     NaN  
96.61      NaN     NaN     NaN     NaN  
100.00   100.0   100.0   100.0   100.0  
Run Code Online (Sandbox Code Playgroud)