Несколько Boxplot с использованием цикла - PullRequest
0 голосов
/ 02 июля 2019

У меня большой набор данных, и я разделил набор данных на небольшие подмножества 0,1 (от 0 до 100). Я хочу построить для этого блок-график (такой же, как линейный график, но с блок-графиком) от 0 до 100.

Для генерации / сокращения данных (первоначально в миллиардах) я запустил цикл, как показано ниже:

a = np.array(Treecover.where(low)).flatten()   # Treecover less than 25 only/low
b = np.array(RZSC.where(low)).flatten()        
Low_TC_data = pd.DataFrame({'Treecover': a, 'RZSC': b})
Low_TC_data_NaN = Low_TC_data.dropna()

Tree = []
Mean = []
Max = []
Min = []
Median = []
for i in np.arange(0,1,0.1):
    Tree.append(i)
    a = 0
    a = Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i)) & (Low_TC_data_NaN['Treecover']<(i+0.1))).dropna()
    Mean.append(a.mean())
    Min.append(a.min())
    Max.append(a.max())  
    Median.append(a.median())

Затем я построил график рассеяния для визуализации данных.

fig = plt.figure(figsize=(10, 7))

plt.scatter(Tree, Mean, s = 500)
plt.scatter(Tree, Median,color = 'red', s = 500)
plt.fill_between(Tree, Min, Max, alpha = 0.3)

enter image description here

Я попытался построить первые 11 коробочных графиков, написав их следующим образом:

fig = plt.figure(figsize=(20, 10))
i = 0
green_diamond = dict(markerfacecolor='w', marker='D')
plt.boxplot((Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i)) & (Low_TC_data_NaN['Treecover']<(i+0.1))).dropna(),
            Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i+0.1)) & (Low_TC_data_NaN['Treecover']<(i+0.2))).dropna(),
           Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i+0.2)) & (Low_TC_data_NaN['Treecover']<(i+0.3))).dropna(),
           Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i+0.3)) & (Low_TC_data_NaN['Treecover']<(i+0.4))).dropna(),
           Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i+0.4)) & (Low_TC_data_NaN['Treecover']<(i+0.5))).dropna(),
           Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i+0.5)) & (Low_TC_data_NaN['Treecover']<(i+0.6))).dropna(),
           Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i+0.6)) & (Low_TC_data_NaN['Treecover']<(i+0.7))).dropna(),
           Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i+0.7)) & (Low_TC_data_NaN['Treecover']<(i+0.8))).dropna(),
           Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i+0.8)) & (Low_TC_data_NaN['Treecover']<(i+0.9))).dropna(),
           Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i+0.9)) & (Low_TC_data_NaN['Treecover']<(i+1))).dropna(),
           Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i+1)) & (Low_TC_data_NaN['Treecover']<(i+1.1))).dropna()),
           flierprops=green_diamond);
# and this code can go on to 
# ....Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i+24.9)) & (Low_TC_data_NaN['Treecover']<(i+25))).dropna()
# For first 250 boxplots

enter image description here

Выше по оси Х 0, 0,1, 0,2, 0,3 ....... 1.

Я хочу, чтобы у меня было 100 таких коробок (или даже 1000), если это возможно.

Я попытался сделать одну неудачную попытку, используя следующий код:

fig = plt.figure(figsize=(5, 10))

data = [(Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i)) & (Low_TC_data_NaN['Treecover']<(i+0.1))).dropna()) for i in np.arange(0,1,0.1)]
[plt.boxplot(np.array(data[i]).ravel()) for i in range(5)];

enter image description here

Значения в этом также кажутся немного странными. И не следует за второй цифрой.

Я хочу коробочный график для всех моих шагов с данными. По сути, я хочу, чтобы второй код цифры был короче (лаконичнее) для тех же результатов, что и на рис. 2, и его можно использовать, когда на оси х имеется около 100 значений.

1 Ответ

0 голосов
/ 03 июля 2019

Я просто немного подправил и вместо того, чтобы зацикливать блокпост, я зацикливал сами данные.

Код выглядит примерно так:

data = [[Low_TC_data_NaN['RZSC'].where((Low_TC_data_NaN['Treecover']>=(i)) & 
                                      (Low_TC_data_NaN['Treecover']<(i+0.1))).dropna()] for i in np.arange(0,25,0.1)]
fig = plt.figure(figsize=(20, 10))
green_diamond = dict(markerfacecolor='w', marker='D')
plt.boxplot(np.array(data).squeeze(), flierprops=green_diamond);
plt.ylim(0,4000)

И результаты были такими: enter image description here

По-видимому, ось X имеет значения от 0 до 25 (всего 250 прямоугольных участков).

...