我一直在使用自己的IMDB数据来练习Pandas和绘图,并创建了一个条形图,用来显示电视剧、电影和电视剧三种收视率之间的收视率分布。
问题是,我的数据集中没有任何电视剧的评分为1或2。我想在电视系列的x轴上显示1和2的0%。
这是我迄今为止想出的代码:
fig, ax = plt.subplots(figsize=(10,4))
x_axis = np.arange(1,11)
movies_x = movies['your rating'].value_counts(normalize=True).sort_index()*100
tvseries_x = tvseries['your rating'].value_counts(normalize=True).sort_index()*100
tveps_x = tveps['your rating'].value_counts(normalize=True).sort_index()*100
width = 0.3
ax.bar(x_axis-width, movies_x, width, label = 'Movies')
ax.bar(x_axis, tveps_x, width, label = 'Episodes')
ax.bar(x_axis[2:]+width, tvseries_x, width, label = 'Series')
ax.bar_label(ax.containers[0], color='blue', fmt='%.f%%', fontsize=8)
ax.bar_label(ax.containers[1], color='red', fmt='%.f%%', fontsize=8)
ax.bar_label(ax.containers[2], color='green', fmt='%.f%%', fontsize=8)
ax.set_xticks(x_axis)
ax.set_xlabel('Rating')
ax.set_ylabel('Percent')
ax.set_title('Rating Distribution per rating type')
ax.legend(loc=6)
plt.tight_layout()
plt.show()
小时
我的解决方法是从3-10(x_axis[2:])开始绘制电视剧,否则我会得到“ValueError:形状不匹配:对象无法广播到单个形状。不匹配是形状为(10,)的arg 0和形状为(8,)的参数1之间。”
我在这里搜索了很多,我所能找到的只是分布基于X轴的问题(例如每个评级组的百分比)。手动编辑系列以添加1、2似乎不是一个理想的解决方案。
请提供任何意见/建议。
谢谢
1条答案
按热度按时间cygmwpex1#
由于没有提供数据,我将通过生成电影评级的(假)数据集来回答这个问题。
再现错误:
这给出了错误:
ValueError: shape mismatch: objects cannot be broadcast to a single shape. Mismatch is between arg 0 with shape (10,) and arg 1 with shape (8,).
解决错误:
您必须确保以
_x
结尾的系列(存储不同评级的百分比)具有从1到10的索引。要做到这一点,不必担心哪些评级不会出现在数据集中,我们可以尝试:这使得
movies_x
为:并且该图形输出为:
小时