Matplotlib:从条形图获取颜色和x/y数据

10

我有一个条形图,想要得到它的颜色和x/y值。以下是示例代码:

import matplotlib.pyplot as plt
def main():
    x_values = [1,2,3,4,5]
    y_values_1 = [1,2,3,4,5]
    y_values_2 = [2,4,6,8,10]
    f, ax = plt.subplots(1,1)
    ax.bar(x_values,y_values_2,color='r')
    ax.bar(x_values,y_values_1,color='b')
    #Any methods?
    plt.show()
if __name__ == '__main__':
    main()

是否有类似于ax.get_xvalues()ax.get_yvalues()ax.get_colors()这样的方法,我可以使用它们从ax中提取出列表x_valuesy_values_1y_values_2以及颜色'r''b'


有点抱歉,但它们会变得脆弱和不方便。通常你会通过 rbar = ax.bar(x_values,y_values_2,color='r') 保存计算出的条形图值,然后使用 rbar 进行操作。你能这样做吗? - cphlewis
我更喜欢不要,但我会接受你所提供的任何东西 :) - noam
2个回答

10

ax 知道它正在绘制哪些几何对象,但是它对于这些几何对象何时添加一无所知,并且当然不知道它们的“含义”:哪个补丁来自哪个条形图等等。编码人员需要跟踪这些以重新提取正确的部分以供进一步使用。解决此问题的方法在许多Python程序中都很常见:调用barplot返回一个BarContainer,您可以命名它并在稍后使用:

import matplotlib.pyplot as plt
def main():
    x_values = [1,2,3,4,5]
    y_values_1 = [1,2,3,4,5]
    y_values_2 = [2,4,6,8,10]
    f, ax = plt.subplots(1,1)
    rbar = ax.bar(x_values,y_values_2,color='r')
    bbar = ax.bar(x_values,y_values_1,color='b')
    return rbar, bbar

if __name__ == '__main__':
    rbar, bbar = main()
    # do stuff with the barplot data:
    assert(rbar.patches[0].get_facecolor()==(1.0,0.,0.,1.)) 
    assert(rbar.patches[0].get_height()==2)

我仍然希望得到一个不使用 rbarbbar,直接从 ax 中提取数据的答案。不过,这也是一个有用的答案。谢谢! - noam
@noam 要从ax中获取,您可以这样做:axis = plot.gca() bar_container = axis.containers[0] print(bar_container.patches[0].get_facecolor()) - siddarfer
至少测试一下如果你直接从轴中提取数据,axis.containers[0] 是否是一个 bar_container,并检查列表中的其他 bar_container。为未来的编码者发出一些警告。我们编写这些内容时假设图的构造和含义不会改变,但实际上可能会改变... - cphlewis

0

稍微变化一下前面的答案,将所有内容都放在调用另一个绘图命令中:

# plot various patch objects to ax2
ax2 = plt.subplot(1,4,2)
ax2.hist(...)
# start a new plot with same colors as i'th patch object
ax3 = plt.subplot(1,4,3)
plot(...,...,color=ax2.axes.containers[i].patches[0].get_facecolor() )

换句话说,我似乎需要在轴句柄和容器句柄之间添加一个轴属性,以使其更加通用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接