1

Тема: [Python] Намалювати графік на основі даних з файлу

Всім доброго дня!
Нещодавно зіткнувся  з певною проблемою,яка мені виявилася не посилах. Саме тому вирішив звернутися на форум.
Проблема полягає в наступному: є файл. В ньому є певні дані,наприклад,місяць та кількість опадів. Потрібно побудувати графік(тобто інформація зчитується з файлу),однак потрібно щоб на вісі ОХ відображалася інформація з першої колонки(в даному випадку - це назва місяців)

2

Re: [Python] Намалювати графік на основі даних з файлу

А в чому власне проблема?

Подякували: koala1

3

Re: [Python] Намалювати графік на основі даних з файлу

LoganRoss написав:

А в чому власне проблема?

Ну в тому,що я не маю уявлення як це правильно зробити
Не знаю як змінити цифри(які є автоматично) на інформацію з першого стовбця(типу місяці)
Який вигляд матеме код?
В мене є таке :

def extract_data(filename):
    infile = open(filename, 'r')    
    infile.readline()      # пропускаем первую строчку
    numbers = []
    
    for line in infile:
        words = line.split()
        number = float(words[1])
        numbers.append(number)       
        
       
    infile.close()
    return numbers

values = extract_data('rainfall.txt')
print (values[:-1])
import matplotlib.pyplot as plt
month = range (1,13)
plt.plot(month, values[:-1], 'o--')
plt.grid(True)
plt.show()
Post's attachments

1.png 49.1 kb, 229 downloads since 2017-06-22 

4

Re: [Python] Намалювати графік на основі даних з файлу

Додайте теґ code (кнопка <> в інструментах).
Ну і збираєте перший стовпчик у щось на кшталт names за аналогією з numbers (тільки з індексами по month, це самі думайте, як), а далі

plt.xticks(month,names)
Подякували: ostap34PHP, N1ck, LoganRoss, NaharD4

5

Re: [Python] Намалювати графік на основі даних з файлу

здається pep8 не вітає коментарів не ASCII

Прихований текст

Source File Encoding

Code in the core Python distribution should always use UTF-8 (or ASCII in Python 2).

Files using ASCII (in Python 2) or UTF-8 (in Python 3) should not have an encoding declaration.

In the standard library, non-default encodings should be used only for test purposes or when a comment or docstring needs to mention an author name that contains non-ASCII characters; otherwise, using \x, \u, \U, or \N escapes is the preferred way to include non-ASCII data in string literals.

For Python 3.0 and beyond, the following policy is prescribed for the standard library (see PEP 3131): All identifiers in the Python standard library MUST use ASCII-only identifiers, and SHOULD use English words wherever feasible (in many cases, abbreviations and technical terms are used which aren't English). In addition, string literals and comments must also be in ASCII. The only exceptions are (a) test cases testing the non-ASCII features, and (b) names of authors. Authors whose names are not based on the latin alphabet MUST provide a latin transliteration of their names.
http://legacy.python.org/dev/peps/pep-0008/

6 Востаннє редагувалося P.Y. (23.06.2017 09:21:58)

Re: [Python] Намалювати графік на основі даних з файлу

Проте, до помилок роботи програми не-ASCII в коментарях не веде* — це суто рекомендація, щоб зробити код доступним для читання/редагування незалежно від локалі, шрифтів та підтримуваних редактором/IDE кодувань.

*) крім випадків, коли кодування редактора несумісне (за межами базового набору символів) з кодуванням транслятора — напр., якщо файл зроблено в cp1251, тоді як python3 вимагає utf-8, то при спробі прочитати файл програми може виникнути помилка кодування.

7

Re: [Python] Намалювати графік на основі даних з файлу

ping написав:

здається pep8 не вітає коментарів не ASCII

Здається, цей форум також не вітає коментарів цією мовою.
Втім, це що, єдине зауваження, яке можна до цього коду зробити? У людини конкретна проблема.

8

Re: [Python] Намалювати графік на основі даних з файлу

Схоже на те, що вам потрібно сформувати список назв місяців і передати в plot, а не "month = range(1,13)".
Ну і відформатуйте код, імпорти робіть з самого верху, побудову графіка теж у функцію. Python закликає до написання читабельного коду, а не отої каші.

Подякували: N1ck1

9

Re: [Python] Намалювати графік на основі даних з файлу

koala написав:

Додайте теґ code (кнопка <> в інструментах).
Ну і збираєте перший стовпчик у щось на кшталт names за аналогією з numbers (тільки з індексами по month, це самі думайте, як), а далі

plt.xticks(month,names)

Дякую за допомогу!
Однак якщо можна можете допомогти з поворотом назви місяця на графіку? Типу якщо буде велике слово,то відбудеться накладання,що унеможливить читання.

10

Re: [Python] Намалювати графік на основі даних з файлу

А погуглити?

plt.xticks(month,names,rotation=45)

чи скільки там вам треба.

Подякували: N1ck1

11

Re: [Python] Намалювати графік на основі даних з файлу

koala написав:

А погуглити?

plt.xticks(month,names,rotation=45)

чи скільки там вам треба.

Гугглив,однак протягом довгого часу не зміг знайти  тому вирішив запитати на форумі,а сьогодні ви дали відповідь.
Як результат вийшло наступне:

import matplotlib.pyplot as plt
import numpy as np

def extract_data(filename):
    infile = open(filename, 'r')    
  #  infile.readline()       пропускаем первую строчку
    numbers = []
    names = []
    for line in infile:
        words = line.split()
        number = float(words[1])
        numbers.append(number)       
        name = str(words[0])
        names.append(name)
        month = range (0,30000)
        plt.xticks(month,names)
        

    infile.close()
    return numbers


values = extract_data('0005.txt')

month = range(0,30000)

plt.xticks(rotation = 90)
plt.xticks(fontsize = 5)

plt.plot(month, values)
plt.grid(True)
plt.savefig('0005.png', dpi=2000)
plt.show()

12

Re: [Python] Намалювати графік на основі даних з файлу

Перенесіть рядки 15-16 в кінець, перед 27-28.
І об'єднайте всі виклики xticks.

13

Re: [Python] Намалювати графік на основі даних з файлу

koala написав:

Перенесіть рядки 15-16 в кінець, перед 27-28.
І об'єднайте всі виклики xticks.

методом ctrl + c, ctrl+v  не вийшло. Лише змінивши код

import matplotlib.pyplot as plt
import numpy as np
 
def extract_data(filename):
    infile = open(filename, 'r')    
  #  infile.readline()       пропускаем первую строчку
    numbers = []
    names = []
    for line in infile:
        words = line.split()
        number = float(words[1])
        numbers.append(number)       
        name = str(words[0])
        names.append(name)  
 
    infile.close()
    return numbers

def extract_data1(filename):
    infile = open(filename, 'r')    
    names = []
    for line in infile:
        words = line.split()   
        name = str(words[0])
        names.append(name)
    infile.close()
    return names

values = extract_data('2.0.txt')
names = extract_data1('2.0.txt')

month = range (0,12)
plt.xticks(month,names,rotation = 90,fontsize = 7)
 
plt.plot(month, values)
plt.grid(True)
#plt.savefig('0005.png', dpi=2000)
plt.show()

14

Re: [Python] Намалювати графік на основі даних з файлу

Ще виникла така проблема,яку я без допомоги більш досвідчених людей не вирішу. При роботі з малими файлами все ок. А от при роботі з великим файлом(розмір 1021 кб,кількість рядків 30000) виникає проблема. Ось фото з помилкою

import matplotlib.pyplot as plt
import numpy as np
 
def extract_data(filename):
    infile = open(filename, 'r')    
  #  infile.readline()       пропускаем первую строчку
    numbers = []
    names = []
    for line in infile:
        words = line.split()
        number = float(words[1])
        numbers.append(number)       
        name = str(words[0])
        names.append(name)  
 
    infile.close()
    return numbers

def extract_data1(filename):
    infile = open(filename, 'r')    
    names = []
    for line in infile:
        words = line.split()   
        name = str(words[0])
        names.append(name)
    infile.close()
    return names

values = extract_data('0000.date')
names = extract_data1('0000.date')

month = range (0,30000)
plt.xticks(month,names,rotation = 90,fontsize = 7)
 
plt.plot(month, values)
plt.grid(True)
plt.savefig('0005.png', dpi=2000)
plt.show()

15

Re: [Python] Намалювати графік на основі даних з файлу

Ви не натиснули "Add file".
Чому ви двічі обробляєте один файл? Робіть це один раз:

def extract_data(filename):
    ...
    return (names, numbers)
...
names, values = extract_data('0000.dat')

Але проблема ваша, гадаю, не в цьому, зачекаю на скріншот.

Подякували: N1ck1

16 Востаннє редагувалося N1ck (24.06.2017 20:46:11)

Re: [Python] Намалювати графік на основі даних з файлу

Ось скрін

import matplotlib.pyplot as plt
import numpy as np
 
def extract_data(filename):
    infile = open(filename, 'r')    
  #  infile.readline()       пропускаем первую строчку
    numbers = []
    names = []
    for line in infile:
        words = line.split()
        number = float(words[1])
        numbers.append(number)       
        name = str(words[0])
        names.append(name)  
 
    infile.close()
    return (names,numbers)
 

names,values = extract_data('0000.dat')
 
month = range (0,30000)
plt.xticks(month,names,rotation = 90,fontsize = 7)
 
plt.plot(month, values)
plt.grid(True)
plt.savefig('0005.png', dpi=2000)
plt.show()
Post's attachments

3.png 90.24 kb, 192 downloads since 2017-06-24 

17

Re: [Python] Намалювати графік на основі даних з файлу

koala написав:

Ви не натиснули "Add file".
Чому ви двічі обробляєте один файл? Робіть це один раз:

def extract_data(filename):
    ...
    return (names, numbers)
...
names, values = extract_data('0000.dat')

Але проблема ваша, гадаю, не в цьому, зачекаю на скріншот.

Ще раз Велике дякую,через брак знань дійсно не знав,що так можна

18 Востаннє редагувалося koala (25.06.2017 08:12:30)

Re: [Python] Намалювати графік на основі даних з файлу

Ну вибачте, там все червоним по білому написано. Навіть автоматичний переклад все коректно подає:
http://replace.org.ua/misc.php?action=pun_attachment&amp;item=1585

Post's attachments

trans.PNG 9.81 kb, 210 downloads since 2017-06-25 

Подякували: LoganRoss1

19

Re: [Python] Намалювати графік на основі даних з файлу

koala написав:

Ну вибачте, там все червоним по білому написано. Навіть автоматичний переклад все коректно подає:
http://replace.org.ua/misc.php?action=pun_attachment&amp;item=1585

Ні,так я не говорив,що не розумію що там написано. Я говорив,що не знаю як це виправити.
Тобто python без різниці з яким розміром файлу працювати? Моя проблема в month = range(0,30000)?

20

Re: [Python] Намалювати графік на основі даних з файлу

Очевидно, що в цьому рядку ви звертаєтесь до індексу, якого не існує, тобто виходите за межі діапазону.

month = range(0, 30000)

Спробуйте так:

month = range(0, 29999)
# або
month = range(1, 30001)

Звісно, якщо ви впевнені що у вашому файлі дійсно не менше 30000 рядків.

Подякували: N1ck1