水平线图,每个ytick有多个条

时间:2019-04-06 23:48:12

标签: python matplotlib

我不太了解如何传递参数以在matplotlib中创建水平条形图。我只是想模仿我在此示例代码中看到的内容... https://pythonspot.com/matplotlib-bar-chart/

以及我在这个stackoverflow帖子中看到的内容 How to plot multiple horizontal bars in one chart with matplotlib

现在我的代码如下:

import numpy as np
x_locs = np.arange(len(total_vals))
t_label_lst = ['Digital Learning Apps', 'News, Events, Daily', 'News on School Events', 'STEM Extracurriculars & School Programs', 'Hiring, STEM Workforce', 'Women in STEM', 'Activities and Projects Outside of the Classroom', 'Ambiguous', 'Ambiguous, STEM in College', 'Next Generation of Engineers', 'News, Events, Daily', 'Educational Policy and Higher Education, Reform', 'STEM Activities, Building, Arts, and Design', 'Engaging students with STEM using programming and robotics', 'Black Leaders in STEM', 'Next Generation of Engineers', 'Ambiguous', 'Astronomy, NASA', 'STEM workshops and summer camps', 'Competitions, Team Credit', 'Ambiguous, Technology Hashtags', 'Google Education', 'Good Job Today! Crediting Daily Activities and Work', 'Engaging students with STEM using programming and robotics', 'Environmental Science', 'Teachers, Public Schools In STEM', 'Ambiguous', 'Edtech Companies', 'Ambiguous, PHD Conversation', 'Ambiguous', 'Engaging students with STEM using programming and robotics', 'Ambiguous, Virtual Reality and Personalized learning mention', 'Ambiguous', 'Ambiguous', 'Ambiguous, #Autism hashtag has disproportionate weight']

print(x_locs)
total_vals = [23668, 13186, 10752, 10002, 9558, 9126, 8138, 7389, 7006, 6965, 6859, 6621, 6538, 5700, 5110, 5069, 4419, 4025, 3943, 3866, 3761, 3697, 3543, 3294, 3067, 2928, 2511, 2491, 2353, 2312, 2229, 2175, 2021, 1921, 1787]
positive_vals = [9941, 9306, 7595, 5935, 5913, 7488, 5258, 4905, 4026, 5242, 5557, 3225, 3530, 3055, 3300, 3503, 2461, 2199, 2074, 2379, 1665, 2274, 2250, 1674, 1523, 1533, 1241, 859, 1504, 1419, 1132, 1082, 805, 753, 580]
neutral_vals = [13727, 3880, 3157, 4067, 3645, 1638, 2880, 2484, 2980, 1723, 1302, 3396, 3008, 2645, 1810, 1566, 1958, 1826, 1869, 1487, 2096, 1423, 1293, 1620, 1544, 1395, 1270, 1632, 849, 893, 1097, 1093, 1216, 1168, 1207]

rects1 = ax.barh(x_locs, total_vals, width=.15, color='r', label="total tweet count")
# rects2 = ax.barh(positive_vals, width=.2, color = 'b', label="positive tweet count")
# rects3 = ax.barh(neutral_vals, width=.2, color='yellow', label="neutral tweet count")
ax.set(yticks=x_locs, yticklabels=t_label_lst, ylim=[0, len(x_locs)])
plt.show()

但是,这只会导致程序崩溃,并显示以下错误消息:“ TypeError:barh()为参数'width'获得了多个值”我什至不确定如果设置了该错误,为什么会出现此错误宽度参数设置为.15。

total_vals包含35个计数或我试图在x轴上绘制的频率。像这些一样,我试图使我的条形以高度体现。 positive_vals和neutral_vals也包含35个计数。

x_locs是我根据示例代码中看到的内容创建的变量,但这只是数字0-34。这只是表明我要显示的35条。

让我感到困惑的是,当我删除x_locs时会发生什么。因此,如果我这样做

 rects1 = ax.barh(total_vals, width=.15, color='r', label="total tweet count")

我得到了这个matplotlib图,它似乎在图的x轴上绘制了我的“宽度”参数,并使width参数成为x轴的极限。

graph in which the x axis is actually the width parameter. At least my yticks are correct

我的yticks似乎实际上按照至少应该去的顺序正确显示,但是看来宽度是在x轴上绘制或测量的宽度...显然,该图为空

我知道我的yticklabels现在太长了,我只是上传了这段代码,只是为了使其可重现。

在这一点上,我真的不确定“ y”参数的实际含义。该文档说“每个条的y坐标”。我最初以为y参数只是我想显示的计数,但后来我看到“ left”参数是“条形左侧的x坐标”。

所以我将代码更改为

rects1 = ax.barh(y=x_locs, left=total_vals, width=.15, color='r', label="total tweet count")

这正确地改变了y轴,但它仍然给了我一个空图。我不知道计数/小节正在发生什么,为什么它们根本不显示。

yet another empty matplotlib graph but at least the x axis is correct now

实际上如何显示条形图?我只是对这些水平条形图的参数实际工作方式有一些困惑。

2 个答案:

答案 0 :(得分:2)

您实际上与您的代码非常接近;您对barh的参数有些困惑。

首先,让我们澄清所需的参数。

第一个位置参数是y,它表示每个类别的y坐标。因此,x_locs是错误的称呼。可以按运行顺序轻松创建它们:第一个类别位于y=0,第二个类别位于y=1,依此类推。

接下来,您传递一个变量total_vals,但也传递width,并得到一个错误。

请注意,条形图是由 position size 两个方面定义的。由于所有条形都与图的左脊对齐,因此它们的x坐标是相同的,它们将仅由其y坐标定义,这已经完成。

对于条形图,我们通常希望一个尺寸是动态的(一个代表一定数量的尺寸),而另一个尺寸对于所有条形都是相同的。相同的是height,因为它等于条形图的垂直尺寸。

另一个动态维度为width,而width代表total_valspositive_valsnegative_vals。相应地,您收到该错误,是因为您试图指定每个小节应该两次的时间。

现在,让我们回到y_locs。请记住,我们希望每个刻度线3条,并排。这相当于说我们希望对条形的每个“类别”(totalnegativepositive)进行微调,否则它们会重叠。

例如,我们可以使negative的条保持在y_loc指定的位置,positive的条向下移动10个像素,而{{1 }},到20。重要的是,我们认识到需要这种补偿的

将所有这些放在一起,我们得到:

total

Output

答案 1 :(得分:0)

我认为简单的答案是将宽度更改为高度,因为它是垂直图。