我想用matplotlib在子块网格上绘制一系列线图。但是,网格的右上部分是左下角的重复,所以我想省略右上角。我附上了我正在寻找的png图像。可以用matplotlib画这样的东西吗?
对于感兴趣的人来说,这是一系列四变量化学反应体系的相图。我把每个变量都标在另一个上面。注意,主对角线表示与自身相对绘制的变量,这也可能被忽略。
我目前使用的代码可能不太有用,但这是我用来做一个完整的4乘4网格,我想做一个4乘4与右上方块左。注意,如果我不绘制一些网格单元,我仍然会显示轴,也许我可以为这些子块旋转轴的绘制?
plt.subplots(4,4,figsize=(9,6))
slist = ['S1', 'S2', 'S3', 'S4']
count = 1
for i in range (4):
for j in range (4):
r.reset()
m = r.simulate (0, 80, 2000, [slist[i], slist[j]])
plt.subplot (4,4,count)
plt.plot (m[:,0], m[:,1])
count += count
plt.show()
以下行调用一个模拟器,该模拟器返回当前选定变量的两列。它没有效率,因为我真的应该调用它一次所有的变量,然后挑选出我想要的每个图。但这只是一个试验绘图的原型。优化可以稍后进行。变量r是对simulstor的引用。
m = r.simulate (0, 80, 2000, [slist[i], slist[j]])
我刚刚发现:
ax = plt.subplot (4,4,count)
plt.plot (m[:,0], m[:,1])
if count in [2,3,4,7,8,12]:
ax.set_visible(False)
这很简单,但需要推广。
最终的代码工作良好,并基于Kota Mori的答案,其中还包括轴标记:
slist = ['S1', 'S2', 'S3', 'S4']
m = r.simulate (0, 80, 2000, slist)
fig = plt.figure(figsize=(9,6))
fig.tight_layout()
count = 0
for i in range(4):
for j in range(4):
count += 1
if i >= j:
ax = fig.add_subplot(4, 4, count)
ax.set_xlabel (slist[i])
ax.set_ylabel (slist[j])
ax.plot (m[:,i], m[:,j])