Я пытаюсь составить сюжеты, описывающие участников, зарегистрированных для предстоящего конкурса.На данный момент у меня есть рабочий код, который создает графики, но я хочу, чтобы графики имели линии вместо точек и пределы y, которые необходимо изменить.Это звучит достаточно просто, но я продолжаю сталкиваться с ошибками, которых не ожидаю.Вероятно, это связано с тем, что мой код не очень эффективен.
Мои текущие данные сохраняются в двух разных массивах, один из которых содержит 349 отдельных делений по 4 характеристикам деления: цвет, возраст, пол и вес, например:итак:
[u'BLUE', u'Master 1', u'Male', u'Heavy'],
[u'BLUE', u'Master 1', u'Male', u'Super-Heavy'],
[u'BLUE', u'Master 1', u'Male', u'Ultra-Heavy'],
[u'BLUE', u'Master 1', u'Female', u'Rooster'],
[u'BLUE', u'Master 1', u'Female', u'Light-Feather'],
[u'BLUE', u'Master 1', u'Female', u'Feather'],
[u'BLUE', u'Master 1', u'Female', u'Light'],
[u'BLUE', u'Master 1', u'Female', u'Middle'],
[u'BLUE', u'Master 1', u'Female', u'Medium-Heavy'],
У меня есть массив длиной 349 с количеством конкурентов в каждом дивизионе.
Моя первоначальная цель состояла в том, чтобы сделать маску, чтобы она выбирала тот же цвет., возраст и пол, а затем построить их по весу.Я также хотел бы составить график, который суммирует все различные возрастные категории для одного и того же цвета и пола и имеет общее количество владельцев регистрации по весу в том же цвете пояса и полу.
Код не любитпостроение графика для строк (для весовых делений), поэтому я также создал словари, содержащие различные весовые деления для оси x:
male_adult_divisions = {"Rooster":127.0, "Light-Feather":141.5, "Feather":154.5, "Light":168.0, "Middle":181.5, "Medium-Heavy":195.0, "Heavy":208.0, "Super-Heavy":222.0, "Ultra-Heavy":235.0}
male_juvenile1_divisions = {"Rooster":107.0, "Light-Feather":118.0, "Feather":129.0, "Light":141.0, "Middle":152.0, "Medium-Heavy":163.0, "Heavy":175.0, "Super-Heavy":186.0, "Ultra-Heavy":197.0}
male_juvenile2_divisions = {"Rooster":118.0, "Light-Feather":129.0, "Feather":141.5, "Light":152.5, "Middle":163.5, "Medium-Heavy":175.0, "Heavy":186.0, "Super-Heavy":197.0, "Ultra-Heavy":208.0}
female_adult_divisions = {"Rooster":107.0, "Light-Feather":118.0, "Feather":129.0, "Light":141.0, "Middle":152.0, "Medium-Heavy":163.0, "Heavy":175.0, "Super-Heavy":186.0}
female_juvenile_divisions = {"Rooster":98.0, "Light-Feather":106.5, "Feather":116.0, "Light":125.0, "Middle":133.5, "Medium-Heavy":143.5, "Heavy":152.0, "Super-Heavy":160.5}
Это код, с которым я до сих пор работал:
for gender in gender_divisions:
gender_index = numpy.where(numpy.transpose(divisions)[2] == gender)
for age in age_divisions:
age_index = numpy.where(numpy.transpose(divisions)[1] == age)
if (age == "Juvenile 1 "or age == "Juvenile 2 ") and gender == "Female":
weight_limits = female_juvenile_divisions
elif age == "Juvenile 1 "and gender == "Male":
weight_limits = male_juvenile1_divisions
elif age == "Juvenile 2 "and gender == "Male":
weight_limits = male_juvenile2_divisions
elif gender == "Female":
weight_limits = female_adult_divisions
else:
weight_limits = male_adult_divisions
mask = numpy.intersect1d(gender_index,age_index)
mask = numpy.intersect1d(mask, exclude_absolute)
if not mask.size:
break
for i,color in enumerate(belt_divisions):
boolean_mask = numpy.zeros(len(numpy.transpose(divisions)[0]))
if color == "WHITE":
white_mask = numpy.intersect1d(mask, numpy.where(color == numpy.transpose(divisions)[0]))
for x in white_mask:
plt.plot(weight_limits[numpy.transpose(divisions[x])[3]],competitors[x], marker = "o", c="white")
elif color == "BLUE":
blue_mask = numpy.intersect1d(mask, numpy.where(color == numpy.transpose(divisions)[0]))
for x in blue_mask:
plt.plot(weight_limits[numpy.transpose(divisions[x])[3]],competitors[x], marker = "o", c="blue")
elif color == "PURPLE":
purple_mask = numpy.intersect1d(mask, numpy.where(color == numpy.transpose(divisions)[0]))
for x in purple_mask:
plt.plot(weight_limits[numpy.transpose(divisions[x])[3]],competitors[x], marker = "o", c="violet")
elif color == "BROWN":
brown_mask = numpy.intersect1d(mask, numpy.where(color == numpy.transpose(divisions)[0]))
for x in brown_mask:
plt.plot(weight_limits[numpy.transpose(divisions[x])[3]],competitors[x], marker = "o", c="brown")
else:
black_mask = numpy.intersect1d(mask, numpy.where(color == numpy.transpose(divisions)[0]))
for x in black_mask:
plt.plot(weight_limits[numpy.transpose(divisions[x])[3]],competitors[x], marker = "o", c="black")
plt.title("Competitors in %s %s Divisions"%(gender,age))
plt.xlabel("Weight Category")
plt.ylabel("Number of Competitors")
plt.ylim(0,)
plt.show()
if age != "Juvenile 1" and age != "Juvenile 2":
if gender == "Female":
weight_limits = female_adult_divisions
mask = numpy.intersect1d(gender_index, exclude_absolute)
for i,color in enumerate(belt_divisions):
boolean_mask = numpy.zeros(len(numpy.transpose(divisions)[0]))
if color == "WHITE":
white_mask = numpy.intersect1d(mask, numpy.where(color == numpy.transpose(divisions)[0]))
for x in white_mask:
plt.plot(weight_limits[numpy.transpose(divisions[x])[3]],competitors[x], marker = "o", c="white")
elif color == "BLUE":
blue_mask = numpy.intersect1d(mask, numpy.where(color == numpy.transpose(divisions)[0]))
for x in blue_mask:
plt.plot(weight_limits[numpy.transpose(divisions[x])[3]],competitors[x], marker = "o", c="blue")
elif color == "PURPLE":
purple_mask = numpy.intersect1d(mask, numpy.where(color == numpy.transpose(divisions)[0]))
for x in purple_mask:
plt.plot(weight_limits[numpy.transpose(divisions[x])[3]],competitors[x], marker = "o", c="violet")
elif color == "BROWN":
brown_mask = numpy.intersect1d(mask, numpy.where(color == numpy.transpose(divisions)[0]))
for x in brown_mask:
plt.plot(weight_limits[numpy.transpose(divisions[x])[3]],competitors[x], marker = "o", c="brown")
else:
black_mask = numpy.intersect1d(mask, numpy.where(color == numpy.transpose(divisions)[0]))
for x in black_mask:
plt.plot(weight_limits[numpy.transpose(divisions[x])[3]],competitors[x], marker = "o", c="black")
plt.title("Competitors in All %s Divisions"%(gender))
plt.xlabel("Weight Category")
plt.ylabel("Number of Competitors")
plt.ylim(0,)
plt.show()
Когда я изначально пытался написать это, я пытался создать индексный массив, который бы выбирал нужные мне деления, но по какой-то причине я не могу заставить его работать.
Например, если у меня есть black_mask = array([343, 344, 345, 346, 347, 348])
, то я пытаюсь сделать divisions[black_mask]
, я получаю:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-17-c1f99913b04a> in <module>()
----> 1 divisions[black_mask]
TypeError: only integer arrays with one element can be converted to an index
Итак, я подумал, может быть, мне нужно сделать логический массив, чтобы использовать его какмаска:
boolean_mask = numpy.zeros(len(numpy.transpose(divisions)[0]))
for x in black_mask:
boolean_mask[x] = 1
, но я получил ту же ошибку, поэтому я закончил тем, что пошел с неэффективным кодом выше.
Затем я хотел изменить y-ограничения на графике,Я сделал это, создав переменную max_ и установив ее на ноль.Каждый раз, когда код вводил одно из операторов if для цвета пояса, я ставил if competitors[x]> max_: max_ = competitors[x]
, но по какой-то причине все мои графики становились пустыми (даже когда я не вставил его в y-Пределы, я думаю).
Я также хотел бы сделать это линейным графиком, но из-за необходимости ставить его по точкам я не смог этого сделать.
Итак, на данный момент я выхожу из этих графиков:

И это то, что я пытаюсь подражать:
