Я не совсем понимаю, как вы должны передавать параметры для создания графика с горизонтальной полосой в matplotlib. Я просто пытаюсь сымитировать то, что вижу в этом примере кода... https://pythonspot.com/matplotlib-bar-chart/
Как и то, что я вижу в этом сообщении stackoverflow Как построить несколько горизонтальных полос на одном графике с помощью 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() получил несколько значений для аргумента« ширина »». Я даже не уверен, почему возникает эта ошибка, если я устанавливаю параметр ширины на .15.
total_vals содержит 35 отсчетов или частот, которые я пытаюсь отобразить по оси X. Например, это значения, которые я пытаюсь отразить в своих столбцах с точки зрения высоты. положительные_валы и нейтральные_валы также содержат 35 отсчетов.
x_locs — это переменная, которую я создал на основе того, что я видел в примере кода, но это просто должны быть числа 0-34. Это просто должно указывать на каждый из 35 баров, которые я пытаюсь показать.
Меня также смущает то, что происходит, когда я удаляю x_locs. Так что, если я просто сделаю
rects1 = ax.barh(total_vals, width=.15, color='r', label = "total tweet count")
Я получаю этот график matplotlib, который, кажется, отображает мой параметр «ширины» по оси x графика/делает параметр ширины пределом оси x.
Кажется, что мои галочки на самом деле отображаются правильно в том порядке, в котором они должны идти, по крайней мере, но похоже, что ширина - это то, что отображается или измеряется по оси x ... и ясно, что график пуст.
Я понимаю, что мои метки ytick прямо сейчас ужасно длинные, и я просто загрузил этот код только для того, чтобы его можно было воспроизвести.
На данный момент я не совсем уверен, что на самом деле должен указывать параметр «y». В документации сказано «координаты y каждого бара». Сначала я думал, что параметр y должен был просто отображать количество, которое я хотел показать, но потом я увидел, что параметр «left» - это «координаты x левых сторон столбцов».
Поэтому я изменил свой код на
rects1 = ax.barh(y=x_locs, left=total_vals, width=.15, color='r', label = "total tweet count")
И это правильно изменило ось Y, но все равно дало мне пустой график. Я не знаю, что происходит с моими счетчиками/полосами и почему они вообще не отображаются.
Как мне на самом деле заставить бары отображаться? У меня просто явная путаница в отношении того, как на самом деле работают параметры для этих горизонтальных гистограмм.
Да, стержни должны быть рядом, а не друг над другом. Данный тик/ярлык, подобный тому, что внизу, «приложения для цифрового обучения», должен иметь по 3 полосы друг под другом.
Я ищу график в этом сообщении о стеке (хотя я думаю, что связал это в исходном вопросе... может быть, я этого не сделал) stackoverflow.com/questions/15201386/…
На самом деле вы были очень близки со своим кодом; вы просто немного запутались в параметрах barh
.
Во-первых, давайте уточним необходимые аргументы.
Первый позиционный аргумент — это y
, который относится к y-координатам каждая категория. Соответственно, x_locs
— это неправильное название. Их можно легко создать в рабочем порядке: первая категория в y=0
, вторая в y=1
и так далее.
Затем вы передаете переменную типа total_vals
, а также width
и получаете ошибку.
Учтите, что бар определяется двумя аспектами: позиция и размер. Поскольку все столбцы выровнены по левому краю графика, их координаты x одинаковы, и они будут определяться исключительно координатами y, что мы уже сделали.
Для гистограммы обычно требуется, чтобы одно измерение было динамическим (тот, который представляет некоторую величину), а другое — одинаковым для всех столбцов. То же самое и есть height
, так как оно равно размеру полосы по вертикали.
Таким образом, другое динамическое измерение — это width
, и именно width
представляет total_vals
, positive_vals
и negative_vals
. Соответственно, вы получили эту ошибку, потому что пытались указать, как долго каждый бар должен быть дважды.
Теперь вернемся к y_locs
. Помните, что нам нужно 3 бара на каждый тик, бок о бок. Это равносильно тому, что мы хотим, чтобы каждый «класс» стержней (total
, negative
и positive
) был немного скорректирован, иначе они будут перекрываться.
Например, мы могли бы оставить столбцы для negative
в положениях, указанных y_loc
, столбцы для positive
сместить вниз на 10 пикселей, а столбцы для total
— на 20. Это деталь реализации; важно то, что мы распознаем нужно для такого смещения.
Сложив все это вместе, мы получим:
import numpy as np
from matplotlib import pyplot as plt
fig, ax = plt.subplots(figsize=(6, 10))
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']
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]
bar_size = 0.25
padding = 0.25
y_locs = np.arange(len(total_vals)) * (bar_size * 3 + padding)
rects1 = ax.barh(y_locs, total_vals, align='edge', height=bar_size, color='r', label = "total tweet count")
rects2 = ax.barh(y_locs + bar_size, positive_vals, align='edge', height=bar_size, color='b', label = "positive tweet count")
rects3 = ax.barh(y_locs + 2 * bar_size, neutral_vals, align='edge', height=bar_size, color='yellow', label = "neutral tweet count")
ax.set(yticks=x_locs, yticklabels=t_label_lst, ylim=[0 - padding, len(x_locs)])
NameError: name 'x_locs' is not defined
. Это должно было быть y_locs
?
Я думаю, что простой ответ - просто изменить ширина на высота, поскольку это вертикальный график.
Чтобы было ясно, вы ожидаете график, на котором столбцы для каждого тика расположены рядом, а не сложены, верно?