1

Тема: допомога новачку

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

2

Re: допомога новачку

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

Because tomorrow may be gone.
Подякували: koala1

3

Re: допомога новачку

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, 9 downloads since 2017-06-22 

4

Re: допомога новачку

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

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

5

Re: допомога новачку

здається 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 10:21:58)

Re: допомога новачку

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

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

py -3 -m pip install git+https://github.com/snoack/python-goto

7

Re: допомога новачку

ping написав:

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

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

8

Re: допомога новачку

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

Мій блог про ОС сімейства *nix - http://nixtravelling.blogspot.com/
Подякували: N1ck1

9

Re: допомога новачку

koala написав:

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

plt.xticks(month,names)

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

10

Re: допомога новачку

А погуглити?

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

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

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

11

Re: допомога новачку

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: допомога новачку

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

13

Re: допомога новачку

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: допомога новачку

Ще виникла така проблема,яку я без допомоги більш досвідчених людей не вирішу. При роботі з малими файлами все ок. А от при роботі з великим файлом(розмір 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: допомога новачку

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

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

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

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

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

Re: допомога новачку

Ось скрін

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, 5 downloads since 2017-06-24 

17

Re: допомога новачку

koala написав:

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

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

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

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

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

Re: допомога новачку

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

Post's attachments

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

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

19

Re: допомога новачку

koala написав:

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

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

20

Re: допомога новачку

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

month = range(0, 30000)

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

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

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

Because tomorrow may be gone.
Подякували: N1ck1