这个Stacked Bar Graph from the matplotlib website的简单示例恰好演示了我正在尝试做的事情。但是,我使用的数据是动态的,通常包含零值。但是,当我绘制零值时,它们在图中显示为细细线。遵循some other帖子的建议,我将零值替换为numpy.nan值。但是,这产生了一个新问题:如果该x值上的条形之一是numpy.nan,则不会显示堆叠的条形。
我将matplotlib与Qt5Agg后端一起使用,因为我将matplotlib图嵌入了我的PyQt5应用程序中。但是,我认为这与问题无关,因为在以下示例中可以重现。
这是来自(1) Stacked Bars with Non-NaN Data网站的简化示例,由以下内容产生:
import numpy as np
import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt
menMeans = (10, 35, 30, 35, 27)
womenMeans = (20, 32, 34, 20, 25)
ind = np.arange(5)
width = 0.35
p1 = plt.bar(ind, menMeans, width)
p2 = plt.bar(ind, womenMeans, width, bottom=menMeans)
plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5'))
plt.yticks(np.arange(0, 81, 10))
plt.legend((p1[0], p2[0]), ('Men', 'Women'))
plt.axes().set_ylim(0, 80)
plt.show()
(2) This example是我遇到的问题。它是由以下人员产生的:
import numpy as np
import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt
menMeans = (np.nan, 35, 30, 35, 27) # NAN VALUE WAS ADDED
womenMeans = (20, 32, 34, 20, 25)
ind = np.arange(5)
width = 0.35
p1 = plt.bar(ind, menMeans, width)
p2 = plt.bar(ind, womenMeans, width, bottom=menMeans)
plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5'))
plt.yticks(np.arange(0, 81, 10))
plt.legend((p1[0], p2[0]), ('Men', 'Women'))
plt.axes().set_ylim(0, 80)
plt.show()
问题:如何在matplotlib的堆叠条形图中绘制零值/numpy.nan值?我想要的行为如下:零值栏不应显示,但仍应允许显示其上方的其他栏。
这是我的第一篇文章。抱歉,如果我犯了任何错误。我试图完全遵守规则。
答案 0 :(得分:0)
在您的bottom=
参数中使用numpy's nan_to_num()
用零代替NaN:
menMeans = (np.nan, 35, 30, 35, 27) # NAN VALUE WAS ADDED
womenMeans = (20, 32, 34, 20, 25)
ind = np.arange(5)
width = 0.35
p1 = plt.bar(ind, menMeans, width)
p2 = plt.bar(ind, womenMeans, width, bottom=np.nan_to_num(menMeans)) # no more NaNs in bottom=
plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5'))
plt.yticks(np.arange(0, 81, 10))
plt.legend((p1[0], p2[0]), ('Men', 'Women'))
plt.ylim((0,80))
plt.show()
PS:如果您使用的是pyplot方法(请参见difference between pyplot and object-oriented APIs),则应该调用plt.ylim()
,而不是您正在做的事情