在R中,我会做以下事情来制作一个小平面网格,每个小平面都有一个光栅图:
# R Code
DF <- data.frame(expand.grid(seq(0, 7), seq(0, 7), seq(0, 5)))
names(DF) <- c("x", "y", "z")
DF$I <- runif(nrow(DF), 0, 1)
# x y z I
# 1: 0 0 0 0.70252977
# 2: 1 0 0 0.74346071
# ---
# 383: 6 7 5 0.93409337
# 384: 7 7 5 0.14143277
library(ggplot2)
ggplot(DF, aes(x = x, y = y, fill = I)) +
facet_wrap(~z, ncol = 3) +
geom_raster() +
scale_fill_viridis_c() +
theme(legend.position = "bottom") # desired legend position should be bottom
字符串
的数据
如何在python中做到这一点(使用matplotlib和可能的seaborn)?我用下面的代码尝试了一下,但是在绘制图像时遇到了麻烦,我用plt.imshow
尝试了一下。由于数据必须为plt.imshow
重新整形,我想我需要一个g.map
的自定义绘图函数。我尝试了几件事,但有问题的轴或颜色和使用的数据在自定义绘图功能。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import itertools
df = pd.DataFrame(list(itertools.product(range(8), range(8), range(6))),
columns=['x', 'y', 'z'])
# order of values different than in R, but that shouldn't matter for plotting
df['I'] = np.random.rand(df.shape[0])
# x y z I
# 0 0 0 0 0.076338
# 1 0 0 1 0.148386
# 2 0 0 2 0.481053
# .. .. .. .. ...
# 382 7 7 4 0.144188
# 383 7 7 5 0.700624
g = sns.FacetGrid(df, col='z', col_wrap=2, height=4, aspect=1)
g.map(plt.imshow, color = 'I') # <- plt.imshow does not work here.
# How can this be corrected (probably with a custom plot function)?
plt.show()
型
1条答案
按热度按时间ego6inou1#
'z'
数据与pandas.DataFrame.pivot
重新整形为seaborn.heatmap
的正确格式。min
和max
定义vmin
和vmax
:vmin=df.I.min()
和vmax=df.I.max()
plt.subplots
预定义了fig
和所有的axes
。fig = plt.figure()
创建图形,并使用fig.add_subplot(2, 3, idx)
添加子图。*在
python v3.12.0
,pandas v2.1.2
,matplotlib v3.8.1
,seaborn v0.13.0
中测试。字符串
的数据
data
用于z: 5
型
plt.figure
和fig.add_subplot
实现,而不是plt.subplots
型