当前位置: 首页 > 面试题库 >

从matplotlib中的图中删除颜色条

钦德佑
2023-03-14
问题内容

这应该很容易,但是我很难过。基本上,我在matplotlib中有一个子图,每次调用一个函数时,我都会绘制一个六边形图,但是每次调用该函数时,都会得到一个新的颜色条,所以我真正想做的就是更新颜色条。不幸的是,这似乎不起作用,因为通过subplot.hexbin重新创建了附加了颜色条的对象。

def foo(self):
   self.subplot.clear()
   hb = self.subplot.hexbin(...)
   if self.cb:
      self.cb.update_bruteforce() # Doesn't work (hb is new)
   else:
      self.cb = self.figure.colorbar(hb)

我现在在这个烦人的地方,尝试完全删除颜色条轴,然后重新创建它。不幸的是,当我删除颜色条轴时,子图轴不会回收空间,并且调用self.subplot.reset_position()并没有达到我的预期。

def foo(self):
   self.subplot.clear()
   hb = self.subplot.hexbin(...)
   if self.cb:
      self.figure.delaxes(self.figure.axes[1])
      del self.cb
      # TODO: resize self.subplot so it fills the 
      #    whole figure before adding the new colorbar
   self.cb = self.figure.colorbar(hb)

有没有人有什么建议?

非常感激!亚当


问题答案:

好吧,这是我的解决方案。不是很优雅,但也不是一个可怕的骇客。

def foo(self):
   self.subplot.clear()
   hb = self.subplot.hexbin(...)
   if self.cb:
      self.figure.delaxes(self.figure.axes[1])
      self.figure.subplots_adjust(right=0.90)  #default right padding
   self.cb = self.figure.colorbar(hb)

因为我只有一个子图,所以这可以满足我的需求。使用多个子图或在不同位置绘制颜色条时遇到相同问题的人将需要进行调整。



 类似资料:
  • 我有一些脚本,产生与颜色输出,我需要删除ANSI代码。 输出为(在日志文件中): 我不知道如何把ESC字符放在这里,所以我把放在它的位置。 我把剧本改成: 但是现在它给我(在日志文件中): 我怎样才能删除这个'? 也许有一种方法可以完全禁用整个脚本的着色?

  • 问题内容: 我想知道如何简单地反转给定颜色图的颜色顺序,以便将其与plot_surface一起使用。 问题答案: 标准色图也都具有相反的版本。它们具有相同的名称,并附加在末尾。(此处的文档。)

  • 问题内容: 我有一个Semilogx图,我想删除xticks。我试过了: 网格消失(确定),但仍保留小刻度线(在主刻度线的位置)。如何删除它们? 问题答案: 该方法对于这样的事情非常有用。此代码关闭主要和次要刻度线,并从x轴删除标签。

  • 问题内容: 我想设置色彩图的中间点,即我的数据从-5到10,我希望零成为中间点。我认为实现此目的的方法是归一化规范化并使用规范,但是我没有找到任何示例,我也不清楚我到底要实现什么。 问题答案: 请注意,在matplotlib 3.1版中,添加了DivergingNorm类。我认为它涵盖了您的用例。可以这样使用: 在matplotlib 3.2中,该类已重命名为TwoSlopesNorm

  • 问题内容: 所有。我想在更改图像数据时更新图形的颜色栏。所以像: 但似乎从fig.axes()返回的结果没有我期望的颜色条实例。我可能可以只将colorbar实例作为参数传递给update函数,但是我认为仅传递一个fig参数就足够了。谁能解释一下如何从图中检索颜色条?还是为什么’fig.axes()’不返回AxesImage或Colobar实例,而仅返回Axes或AxesSubplot?我想我只需

  • 问题内容: 我该如何删除matplotlib轴的一条线(或多条线),使其实际上收集到垃圾并释放回内存?以下代码似乎删除了该行,但是从不释放内存(即使显式调用) 问题答案: 我正在展示 和结合使用的技巧。 我检查了您的大型数据集,并在系统监视器上也确认了内存的释放。 当然,更简单的方法(当不进行故障排除时)是从列表中弹出它并在不创建硬引用的情况下调用该行对象: