簡體   English   中英

Matplotlib:如果繪制了numpy.nan值,則不會顯示堆疊的條

[英]Matplotlib: stacked bars do not display if numpy.nan values are plotted

matplotlib網站上的堆積條形圖的這個簡單示例完全說明了我正在嘗試做的事情。 但是,我使用的數據是動態的,通常包含零值。 但是,當我繪制零值時,它們在圖中顯示為細細線。 遵循其他 一些文章的建議,我將零值替換為numpy.nan值。 但是,這產生了一個新問題:如果該x值上的條形之一是numpy.nan,則不會顯示堆疊的條形。

我將Matplotlib與Qt5Agg后端一起使用,因為我將matplotlib圖嵌入了我的PyQt5應用程序中。 但是,我認為這與問題無關,因為在以下示例中可以重現。

這是來自網站的簡化示例: (1)包含非NaN數據的堆疊條形 ,是由以下內容產生的:

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)這個例子是我遇到的問題。 它是由以下人員產生的:

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值? 我想要的行為如下:零值欄不應顯示,但仍應允許顯示其上方的其他欄。

這是我的第一篇文章。 抱歉,如果我犯了任何錯誤。 我試圖完全遵守規則。

使用numpy的nan_to_num()在您的bottom=參數中將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方法(請參閱pyplot和面向對象的API之間的區別 ),則應該調用plt.ylim() ,而不是您正在做的事情

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM