使用matplotlib在条形图中反映点

3

我在编写代码制作一张柱状图,其中包括一些正数和负数 - 查看这里

简而言之,我想做的是将所有负值作为绿色部分并覆盖到正面,以便您可以看到这些值的不对称性。我尝试了几种方法来实现这个目标,但好像找不到一个很好的答案。

目前为止我已经写了相关代码(我希望没有漏掉重要的内容来制图...):

import glob
import pyrap.images as pim
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
import matplotlib.mlab as mlab
from scipy.optimize import * 

less_than_expected_min = -500
more_than_expected_max = 1200
n_bins = 100

bin_edges = np.linspace(less_than_expected_min, more_than_expected_max, n_bins)
for i in range(total):
    all_clipped_values = np.zeros([total,n_bins-1])

clipped_levels= np.sum(all_clipped_values,axis=0)

reflect= np.concatenate([clipped_levels[0:30], clipped_levels[30:0]])


plt.bar(bin_edges[:-1],clipped_levels,width=(more_than_expected_max -less_than_expected_min)/float(n_bins), log=True,color='green')
plt.bar(bin_edges[:-1],reflect,width=(more_than_expected_max -less_than_expected_min)/float(n_bins), log=True,color='red')

尝试使用这种方法时,我的问题是我得到了“AssertionError:不兼容的大小:参数'height'必须是长度为99或标量。” 对于我来说并不太清楚如何解决这个问题,实际上是否有比我想象中更简单的反射方法也不确定。欢迎任何反馈-谢谢!

你在哪一行遇到了这个错误? - Pax Vobiscum
我认为在“clipped_levels [30:0]”中,您必须采取负的步长,如“clipped_levels [30:0:-1]”。 - Pax Vobiscum
我不确定这是否与您的问题有关,但我不理解 for i in range... 部分:它在每次迭代中将相同的值分配给 all_clipped_values... - Daneel
2个回答

1
正如我在评论中提到的那样,也许这会澄清一些问题。
>>> x = list(range(100))
>>> x[0:30]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
>>> x[30:0]
[]
>>> x[30:0:-1]
[30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

您需要指定负步长。

0
每次调用plt.bar时,如果您的第一个参数是长度为n的数组(横坐标集),则您的第二个参数必须是长度为n的数组(纵坐标集)。
在您的情况下,由于构建的横坐标集长度为99,因此您必须确保纵坐标集具有相同的形状。
对于第一个调用,您的第二个参数clipped_levels似乎具有正确的长度,但对于第二个调用,第二个参数是reflect - 远非99项长。
改正这些问题,它应该可以工作,希望如此!
编辑:
reverse = np.concatenate([clipped_levels[:n_bins/2], clipped_levels[n_bins/2-2::-1]])这样的代码应该可以解决问题。
另外,我仍然认为您的for循环可以被单个指令(即all_clipped_values的初始化)替换,除非还有其他在此处不相关的代码。

1
好的,这很有帮助——该行不太正确,因为它在图中镜像了整个绿色部分而不仅仅是负部分,但是通过调试最终得到了正确答案。谢谢!我还应该注意到,在for循环中还有其他事情发生,但我没有放进去,因为那不相关。 - kb3hts

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