【问题标题】:Grouped scatter plot with colorbar via pandas plotting interface通过 pandas 绘图界面使用颜色条分组散点图
【发布时间】:2019-06-03 07:08:20
【问题描述】:

当我从 pandas 绘制分组散点图(如 documentation 中所述)时,其中第二组需要包含彩条,我收到错误 TypeError: You must first set_array for mappable

different questions for ungrouped scatter plots 之外的其他之后,这是因为cmap 仅在c 是浮点数组时使用。但是独立它可以完美地工作,并且在创建两个轴对象之间不会操纵数据。

这是我正在使用的代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.rand(100, 5), columns=['A', 'B', 'C', 'D', 'E'])

# this works stand-alone
#df.plot(kind='scatter', x='A', y='B', c='C', cmap='Blues')

# why does this break?
ax = df.plot(kind='scatter', x='D', y='E', color='red', label='Other group')
df.plot(kind='scatter', x='A', y='B', c='C', cmap='Blues', ax=ax)
plt.show()

两个组应显示在一个图中。请注意,在将 A、B 和 C 绘制在它们之上之前绘制列 D 和 E 对我来说很重要,因此后者需要在第二个图中。反之亦然,它可以工作,但根据我的要求,它会中断。

有谁知道如何解决这个问题并获得想要的结果?

提前致谢!

【问题讨论】:

  • 在您的独立版中,您没有为两个图使用相同的 ax。两个图分别绘制。在您有问题的情况下,您尝试使用ax 将两者绘制在同一个图中。期望的输出是什么?两个单独的地块或两个单独的地块
  • 一个单一的情节,如下面的答案!
  • 我会指定我的问题!

标签: python pandas matplotlib plot


【解决方案1】:

熊猫似乎对在内部制作颜色条感到困惑。不过,您始终可以选择使用 matplotlib 创建颜色条。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.rand(100, 5), columns=['A', 'B', 'C', 'D', 'E'])

ax = df.plot(kind='scatter', x='D', y='E', color='red', label='Other group')
df.plot(kind='scatter', x='A', y='B', c='C', cmap='Blues', ax=ax, colorbar=False)
ax.figure.colorbar(ax.collections[1])   # Note the index 1, which stands
                                        # for second scatter in the axes.
plt.show()

【讨论】:

  • 非常感谢!我已经接受了另一个答案,因为它是第一个答案,它仍然包含颜色条标签,没有额外的代码..
【解决方案2】:

颠倒你的绘图顺序。我认为颜色条对应用哪个图表感到困惑。因此,我们尝试用彩条绘制第一个图,然后在顶部应用红色散点图。

df = pd.DataFrame(np.random.rand(100, 5), columns=['A', 'B', 'C', 'D', 'E'])

# this works stand-alone
#df.plot(kind='scatter', x='A', y='B', c='C', cmap='Blues')

# why does this break?
# ax = df.plot(kind='scatter', x='D', y='E', color='red', abel='Other group')
ax = df.plot(kind='scatter', x='A', y='B', c='C', cmap='Blues', zorder=10)
df.plot(kind='scatter', x='D', y='E', color='red', label='Other group', ax=ax, zorder=1)
plt.show()

输出:

zorder:

【讨论】:

  • 感谢您的帮助。正如我所提到的,我需要在 A、B 和 C 列之前绘制 D 和 E。或者在结果方面,A、B 和 C 的标记必须“覆盖”D 和 E 的标记。有没有可能得到这个结果?
  • 试试zorder 参数。请参阅更新的解决方案。请参阅 matplotdocs 和 example
  • 完美! zorder 是关键字,你拯救了我的一天 ;-) 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-09-10
  • 2015-06-13
  • 1970-01-01
  • 2015-05-28
  • 2013-11-19
  • 2014-04-28
  • 1970-01-01
  • 2011-08-29
相关资源
最近更新 更多