Проблема с созданием боксплота с заданным элементом в массиве numpy - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь создать boxplot, но у меня проблема с попыткой понять синтаксис. На данный момент это мой код

mydata = np.array([data['Adult_Card'], (data2[(data2['Fare_Type']=='Adult card fare') & (data2['Applicable_Time']=='All other timings')]['Fare_per_Ride']),
                 (data2[(data2['Fare_Type']=='Adult card fare') & (data2['Applicable_Time']=='Before 7.45am  (Weekdays excluding public holidays)')]['Fare_per_Ride']),
                 (data2[(data2['Fare_Type']=='Single trip') & (data2['Applicable_Time']=='All timings')]['Fare_per_Ride']),
                 (data['Adult_Cash'])])
labels = np.array(["Adult Card(Bus)","Adult Card(MRT)","Adult Card(Before 7.45am MRT)","Single Trip", "Adult Cash"])
fig = plt.figure(figsize=(20,10))
ax1 = fig.add_subplot(111)
ax1.set_xticklabels(labels, rotation='vertical')
plt.title(title)
plt.xlabel('Distance(Km)')
plt.ylabel('Fares')
plt.legend(loc='upper left');
print(mydata)
plt.boxplot(mydata,labels=labels)
plt.show()

Это значение mydata

[[ 83  93 103 113 122 129 135 139 143 147 151 155 159 163 167 171 175 178
  181 184 187 189 191 193 194 195 196 197 198 199 200 201 202 203 204 205
  206 207 208]
 [ 83  93 103 113 122 129 135 139 143 147 151 155 159 163 167 171 175 178
  181 184 187 189 191 193 194 195 196 197 198 199 200 201 202 203 204 205
  206 207 208]
 [ 33  43  53  63  72  79  85  89  93  97 101 105 109 113 117 121 125 128
  131 134 137 139 141 143 144 145 146 147 148 149 150 151 152 153 154 155
  156 157 158]
 [150 170 170 170 190 190 190 210 210 230 230 230 230 240 240 240 240 250
  250 250 250 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260
  260 260 260]
 [150 170 170 170 190 190 190 210 210 230 230 230 230 240 240 240 240 250
  250 250 250 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260
  260 260 260]]

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

[ 83  93 103 113 122 129 135 139 143 147 151 155 159 163 167 171 175 178
  181 184 187 189 191 193 194 195 196 197 198 199 200 201 202 203 204 205
  206 207 208]

будет первой коробкой, а затем. Я совершенно новичок в matplotlib, поэтому я не знаю, что не так. Это ошибка

ValueError                                Traceback (most recent call last)
<ipython-input-29-31b9e5335060> in <module>
     32 print("Original data: " + str(data2.shape))
     33 print(mydata)
---> 34 plt.boxplot(mydata,labels=labels)
     35 plt.show()

~\Anaconda3\lib\site-packages\matplotlib\pyplot.py in boxplot(x, notch, sym, vert, whis, positions, widths, patch_artist, bootstrap, usermedians, conf_intervals, meanline, showmeans, showcaps, showbox, showfliers, boxprops, labels, flierprops, medianprops, meanprops, capprops, whiskerprops, manage_xticks, autorange, zorder, data)
   2494         whiskerprops=whiskerprops, manage_xticks=manage_xticks,
   2495         autorange=autorange, zorder=zorder, **({"data": data} if data
-> 2496         is not None else {}))
   2497 
   2498 

~\Anaconda3\lib\site-packages\matplotlib\__init__.py in inner(ax, data, *args, **kwargs)
   1808                         "the Matplotlib list!)" % (label_namer, func.__name__),
   1809                         RuntimeWarning, stacklevel=2)
-> 1810             return func(ax, *args, **kwargs)
   1811 
   1812         inner.__doc__ = _add_data_doc(inner.__doc__,

~\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in boxplot(self, x, notch, sym, vert, whis, positions, widths, patch_artist, bootstrap, usermedians, conf_intervals, meanline, showmeans, showcaps, showbox, showfliers, boxprops, labels, flierprops, medianprops, meanprops, capprops, whiskerprops, manage_xticks, autorange, zorder)
   3501 
   3502         bxpstats = cbook.boxplot_stats(x, whis=whis, bootstrap=bootstrap,
-> 3503                                        labels=labels, autorange=autorange)
   3504         if notch is None:
   3505             notch = rcParams['boxplot.notch']

~\Anaconda3\lib\site-packages\matplotlib\cbook\__init__.py in boxplot_stats(X, whis, bootstrap, labels, autorange)
   1179         labels = itertools.repeat(None)
   1180     elif len(labels) != ncols:
-> 1181         raise ValueError("Dimensions of labels and X must be compatible")
   1182 
   1183     input_whis = whis

ValueError: Dimensions of labels and X must be compatible

Обновление: я удалил np.array () из моих данных, и он работает нормально. У меня нет объяснений, почему это все исправляет.

Ответы [ 2 ]

1 голос
/ 21 июня 2019

РЕДАКТИРОВАТЬ:

Я почему-то упустил тот факт, что mydata это массив Numpy, а не список списков ... Чтобы ваш код работал с массивом Numpy, выследует использовать транспонирование mydata следующим образом:

###

plt.boxplot(mydata.T, labels=labels)

###

Порядковый пост, указанный ниже


Где-то каким-то образом ваше сообщение об ошибке не соответствует вашему коду.Если я запускаю следующий код, я определенно получаю коробочный график.

import numpy as np
from matplotlib import pyplot as plt

mydata = [
    [ 83, 93, 103, 113, 122, 129, 135, 139, 143,
      147, 151, 155, 159, 163, 167, 171, 175, 178,
      181, 184, 187, 189, 191, 193, 194, 195, 196,
      197, 198, 199, 200, 201, 202, 203, 204, 205,
      206, 207, 208], 
    [ 83, 93, 103, 113, 122, 129, 135, 139, 143,
      147, 151, 155, 159, 163, 167, 171, 175, 178,
      181, 184, 187, 189, 191, 193, 194, 195, 196,
      197, 198, 199, 200, 201, 202, 203, 204, 205,
      206, 207, 208], 
    [ 33, 43, 53, 63, 72, 79, 85, 89, 93, 97, 101,
      105, 109, 113, 117, 121, 125, 128, 131, 134,
      137, 139, 141, 143, 144, 145, 146, 147, 148,
      149, 150, 151, 152, 153, 154, 155, 156, 157,
      158], 
    [150, 170, 170, 170, 190, 190, 190, 210, 210,
     230, 230, 230, 230, 240, 240, 240, 240, 250,
     250, 250, 250, 260, 260, 260, 260, 260, 260,
     260, 260, 260, 260, 260, 260, 260, 260, 260,
     260, 260, 260], 
    [150, 170, 170, 170, 190, 190, 190, 210, 210,
     230, 230, 230, 230, 240, 240, 240, 240, 250,
     250, 250, 250, 260, 260, 260, 260, 260, 260,
     260, 260, 260, 260, 260, 260, 260, 260, 260,
     260, 260, 260]
]
labels = np.array(["Adult Card(Bus)", "Adult Card(MRT)", "Adult Card(Before 7.45am MRT)", "Single Trip",  "Adult Cash"])
fig = plt.figure(figsize=(20, 10))
ax1 = fig.add_subplot(111)
ax1.set_xticklabels(labels,  rotation='vertical')
plt.title('title')
plt.xlabel('Distance(Km)')
plt.ylabel('Fares')
plt.legend(loc='upper left');
print(mydata)
plt.boxplot(mydata, labels=labels)
plt.show()

Есть некоторые другие вещи, которые происходят неправильно, например, я получаю предупреждение о том, что "не найдено никаких ручек с метками, которые можно поставитьв легенде. ", но, возможно, это лучше задать в другом вопросе.

0 голосов
/ 21 июня 2019

Документация boxplot гласит:

Создайте диаграмму прямоугольников и усов для каждого столбца x или каждого вектора в последовательности x.

Как следствие, необходимо различать два случая

Последовательность векторов

Коробки создаются для каждого вектора (т. Е. Кортеж, список, массив)последовательность (т. е. кортеж, список).

import numpy as np
import matplotlib.pyplot as plt

data = [[11, 21, 31, 41],  # box 1
        [12, 22, 32, 42],  # box 2
        [13, 23, 33, 43]]  # box 3

plt.boxplot(data)
plt.show()

enter image description here

Это дает 3 поля, каждое из которых содержит данные каждого внутреннего списка.Это позволяет иметь векторы разной длины

data = [[11, 21, 31, 41, 51, 61],
        [12, 22, 32],
        [13, 23, 33, 43]]

enter image description here

Массив

Если входной массив является массивом, он интерпретируется по столбцам , т. Е. Каждый столбец в двумерном массиве получает свой собственный прямоугольник.

import numpy as np
import matplotlib.pyplot as plt

data = np.array([[11, 21, 31, 41],
                 [12, 22, 32, 42],
                 [13, 23, 33, 43]])
#                 ^   ^   ^   ^
#           box   1   2   3   4

plt.boxplot(data)
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...