Как управлять разными метками в гистограмме, беря данные из текстового файла?

#python #matplotlib

#python #matplotlib

Вопрос:

Я новичок в использовании matplotlib, поэтому у меня возникли некоторые проблемы. Я должен создать гистограмму с разными метками для каждого веб-сайта, который у меня есть. Файл выглядит следующим образом:

 1001 adblock 12
1001 badger 11
1001 disconnect 15
1001 ghostery 15
1001 nottrack 14
1001 origin 15
1001 policy 16
1001 ultimate 14
4ruote adblock 12
4ruote badger 1
4ruote disconnect 14
4ruote ghostery 27
4ruote nottrack 9
4ruote origin 26
4ruote policy 34
4ruote ultimate 20
...... ........ ...
  

Моя цель — создать столбчатую диаграмму, в которой у меня есть:

  1. на узлах оси x (первый столбец файла) находится строка

  2. на оси y значения (третий столбец файла) для этого сайта (которые 8 раз повторяются внутри файла), так что 8 целых значений

  3. метки, которые для определенного сайта присутствуют во втором столбце (строки).

Я читал разные ответы, но каждый из них не угрожал этому сравнению между метками для одной и той же переменной. То, что я делаю, это считываю файл, разделяю строку и беру первый и третий столбцы, но как я могу управлять метками?

Ответ №1:

seaborn это аккуратно:

 from pandas import read_csv
from matplotlib.pyplot import show
from seaborn import factorplot

fil = read_csv('multi_bar.txt', sep=r's*', engine='python', header=None)
fil.columns=['site','type','value']

factorplot(data=fil, x='site', y='value', hue='type', kind='bar')

show()
  

введите описание изображения здесь

Комментарии:

1. О, очень хорошо!! это именно то, что я хотел получить, но я хочу спросить вас только об одном: в первой части (веб-сайт 1001), почему последний штрих не был нанесен для adblock, даже если у меня есть в файле:

2. 1001 adblock 12, который должен отображать верхнюю полосу 12!!

3. Хороший улов! read_csv предполагается, что первая строка является строкой заголовка, а не данными. Исправлено.

Ответ №2:

Давайте предположим, что вы прочитали веб-сайты в 8 разных наборах данных (adblock, badger, disconnect и т. Д.). Затем вы можете использовать приведенную ниже логику для построения каждого ряда и отображения их меток в легенде.

 import numpy
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
#this is your number of datasets
x = numpy.arange(8)
width = 0.1
#plot each dataset here, offset by the width of the preceding bars
b1 = ax.bar(x, adblock, width, color='r')
b2 = ax.bar(x   width, badger, color='g')
b3 = ax.bar(x   width*2, disconnect, color='m')
legend([b1[0], b2[0], b3[0]], ['adblock', 'badger',
                                          'disconnect'])
plt.show()
  

Комментарии:

1. Итак, могу ли я построить для конкретного веб-сайта сравнение между различными наборами данных? Потому что я пытаюсь прочитать файл строка за строкой и. Есть ли другой простой способ сделать это?

2. Я смущен вашим вопросом — этот подход даст график, аналогичный показанному здесь: matplotlib.org/examples/api/barchart_demo.html . Где мужчины, женщины и т. Д. Будут Вашими сайтами.

3. Я имею в виду: каким образом я могу собирать данные в наборах данных? потому что я новичок в python и знаю, что это возможно со словарем (поэтому для каждого сайта и плагина -> plot …). Но мой вопрос: есть ли простой способ создать этот набор данных, непосредственно работающий с полученным файлом выше?

4. В любом случае, я видел этот график, и это именно то, что я хочу получить. Но в этом примере данные были переданы вручную, а не взяты в файл.. итак, у меня проблемы..

5. Еще лучше то, что я хочу получить, это список веб-сайтов по оси X, значения по Y и в качестве меток (для каждого сайта) разные плагины. So все же отличается от решения, предложенного вами.