Подтвердить что ты не робот

Как построить очень простую гистограмму (Python, Matplotlib) с использованием файла ввода *.txt?

Я использую Python 2.7 и matplotlib. У меня есть файл данных *.txt:

0 14-11-2003
1 15-03-1999
12 04-12-2012
33 09-05-2007
44 16-08-1998
55 25-07-2001
76 31-12-2011
87 25-06-1993
118 16-02-1995
119 10-02-1981
145 03-05-2014

первый столбец моего файла (числа) должен быть на оси Y в моей гистограмме, а второй столбец из моего файла (даты) должен быть на оси OX на моей гистограмме. Я знаю только, как читать файл:

OX = []
OY = []

try :
    with open('data.txt', 'r') as openedFile :
        for line in openedFile :
            tab = line.split()
            OY.append(int(tab[0]))
            OX.append(str(tab[1]))
except IOError :
    print("IOError!")

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

this

Может ли кто-нибудь помочь мне?

4b9b3361

Ответ 1

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

Вот полный пример из ваших данных, который показывает строку для каждого требуемого значения в каждой дате:

import pylab as pl
import datetime

data = """0 14-11-2003
1 15-03-1999
12 04-12-2012
33 09-05-2007
44 16-08-1998
55 25-07-2001
76 31-12-2011
87 25-06-1993
118 16-02-1995
119 10-02-1981
145 03-05-2014"""

values = []
dates = []

for line in data.split("\n"):
    x, y = line.split()
    values.append(int(x))
    dates.append(datetime.datetime.strptime(y, "%d-%m-%Y").date())

fig = pl.figure()
ax = pl.subplot(111)
ax.bar(dates, values, width=100)
ax.xaxis_date()

Вам нужно проанализировать дату с помощью strptime и установить ось X для использования дат (как описано в этом ответе).

Если вы не заинтересованы в том, чтобы ось X показывала линейную шкалу времени, но просто хотите использовать бары с метками, вы можете сделать это вместо:

fig = pl.figure()
ax = pl.subplot(111)
ax.bar(range(len(dates)), values)

EDIT: после комментариев, для всех тиков и для их центрирования, передайте диапазон до set_ticks (и переместите их на половину ширины полосы):

fig = pl.figure()
ax = pl.subplot(111)
width=0.8
ax.bar(range(len(dates)), values, width=width)
ax.set_xticks(np.arange(len(dates)) + width/2)
ax.set_xticklabels(dates, rotation=90)

Ответ 2

Этот код будет делать то, что вы ищете. Он основан на примерах, найденных здесь здесь и здесь.

Вызов autofmt_xdate() особенно полезен для считывания ярлыков оси x.

import numpy as np
from matplotlib import pyplot as plt

fig = plt.figure()

width = .35
ind = np.arange(len(OY))
plt.bar(ind, OY, width=width)
plt.xticks(ind + width / 2, OX)

fig.autofmt_xdate()

plt.savefig("figure.pdf")

enter image description here

Ответ 3

Во-первых, то, что вы ищете, это столбцы столбца или ,, а не гистограмма. Гистограмма производится из частотного распределения непрерывной переменной, которая разделяется на ячейки. Здесь у вас есть столбец против отдельных меток.

Чтобы создать диаграмму с помощью matplotlib, используйте метод matplotlib.pyplot.bar(). Посмотрите эту страницу документации matplotlib, которая очень хорошо объясняет примеры и исходный код, как это сделать.

Если это возможно, я бы просто предположил, что для простой задачи вроде этого, если бы вы могли избежать написания кода, который был бы лучше. Если у вас есть программа для работы с электронными таблицами, это должно быть кусок пирога, потому что это именно то, для чего они предназначены, и вам не придется "изобретать велосипед". Ниже приведен график ваших данных в Excel:

Bar diagram plot in Excel

Я только что скопировал ваши данные из вопроса, использовал мастер импорта текста, чтобы поместить его в два столбца, а затем вставил диаграмму столбца.