python - 在 Python 中优化和改进绘图
问题描述
我正在尝试制作描述为即将举行的比赛注册的竞争对手的情节。目前,我有一个制作绘图的工作代码,但我想让绘图有线条而不是点,并且要更改 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 限制中,我认为)。
我也想把它做成一个折线图,但由于必须逐点放置,我无法做到。
所以目前这些是我要出去的地块类型:
这就是我想要效仿的:
解决方案
推荐阅读
- php - XML 2 mySQL 致命错误:调用成员函数 item()
- css - 为什么 webpack 开发服务器服务器 CSS 包带有 text/html MIME 类型?
- azure - 是否可以访问 pod DNS(使用 dig 或 nslookup)?
- matlab - 如何使用matlab找到矩阵的接近值
- microsoft-graph-api - Graph API:如何获取其他用户的 Outlook 类别
- teradata - 有没有办法将多字节字符转换为 teradata 中的单字节。
- php - PHP - 在文本框中显示数据库值
- python - kind="previous" 的 scipy.interpolate.interp1d 没有按预期推断
- c++ - 在不同的派生类中继承具有不同参数的纯虚方法
- python - UnicodeDecodeError:“charmap”编解码器无法解码位置 386 中的字节 0x8d:字符映射到