我在 python 2 中使用 plotnine (但会很高兴使用 matplotlib 或任何其他绘图包的解决方案)。我有一个带有 4 个参数的函数(下面稍微简化了)。我想绘制一个热图网格,“超轴”改变两个参数,每个热图改变另外两个。有点像这样:
我想出了这段代码:
from plotnine import ggplot, aes, facet_grid, geom_tile
import pandas as pd
import itertools
def fun((i, j, n, p)):
if n > j:
return 1 if (p**(3*n)) > ((p+i)**(3*(n-j))) else 0
return -1
ilist, jlist, nlist, plist = range(1,10), range(1,9), range(8,10), range(4,6)
rows = itertools.product(ilist, jlist, nlist, plist)
df = pd.DataFrame(list(rows))
df.columns = ['i','j','n','p']
df['fun'] = df.apply(fun, axis=1)
(ggplot(df, aes('factor(i)', 'factor(j)')) +
geom_tile(aes(fill='fun')) +
facet_grid('n ~ p', labeller='label_both'))
这会产生以下结果:
这(或多或少)具有我想要的形式,但热图似乎是错误的。(编辑:我发现错误在 的定义中fun
,而不是在绘图中 - 请参阅我的答案)。