Горизонтальный столбчатый график с несколькими столбцами на тик

Я не совсем понимаю, как вы должны передавать параметры для создания графика с горизонтальной полосой в 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, но все равно дало мне пустой график. Я не знаю, что происходит с моими счетчиками/полосами и почему они вообще не отображаются.

Горизонтальный столбчатый график с несколькими столбцами на тик

Как мне на самом деле заставить бары отображаться? У меня просто явная путаница в отношении того, как на самом деле работают параметры для этих горизонтальных гистограмм.

Чтобы было ясно, вы ожидаете график, на котором столбцы для каждого тика расположены рядом, а не сложены, верно?

gmds 07.04.2019 02:28

Да, стержни должны быть рядом, а не друг над другом. Данный тик/ярлык, подобный тому, что внизу, «приложения для цифрового обучения», должен иметь по 3 полосы друг под другом.

Byron Smith 07.04.2019 02:34

Я ищу график в этом сообщении о стеке (хотя я думаю, что связал это в исходном вопросе... может быть, я этого не сделал) stackoverflow.com/questions/15201386/…

Byron Smith 07.04.2019 02:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
2 060
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

На самом деле вы были очень близки со своим кодом; вы просто немного запутались в параметрах 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)])

Output

NameError: name 'x_locs' is not defined. Это должно было быть y_locs?
Joe 11.02.2022 21:10

Я думаю, что простой ответ - просто изменить ширина на высота, поскольку это вертикальный график.

Другие вопросы по теме