2015-06-29 5 views
1

Это все на машине с 7-разрядным 64-разрядным окном, работающем под управлением python 3.4.3 x64 бит, в компиляторе PyCharm Educational edition 1.0.1. Данные, используемые для этой программы, взяты из программы Citi Bike в Нью-Йорке (данные находятся здесь: http://www.citibikenyc.com/system-data).сортировка по оси x pyplot

Я отсортировал данные так, чтобы у меня был новый CSV-файл с только идентификаторами байкеров Uniqe и сколько раз каждый велосипед ездил (файл называется Sorted_Bike_Uses.csv). Я пытаюсь сделать график с идентификатором байка против количества применений (идентификаторы байка на оси x, # использования на оси y). Мой код выглядит так:

import pandas as pd 
import matplotlib.pyplot as plt 

# read in the file and separate it into two lists 
a = pd.read_csv('Sorted_Bike_Uses.csv', header=0) 
b = a['Bike ID'] 
c = a['Number of Uses'] 

# create the graph 
plt.plot(b, c) 

# label the x and y axes 
plt.xlabel('Bicycles', weight='bold', size='large') 
plt.ylabel('Number of Rides', weight='bold', size='large') 

# format the x and y ticks 
plt.xticks(rotation=50, horizontalalignment='right', weight='bold', size='large') 
plt.yticks(weight='bold', size='large') 

# give it a title 
plt.title("Top Ten Bicycles (by # of uses)", weight='bold') 

# displays the graph 
plt.show() 

Он создает почти правильно отформатированный график. Единственная проблема заключается в том, что он сортирует идентификаторы велосипедов, чтобы они были в численном порядке, а не в порядке использования. Я попытался перепрофилировать старый код, который я использовал для создания аналогичного графика, но он просто делает еще худший график, который каким-то образом накладывает два набора данных. Это выглядит следующим образом:

my_plot = a.sort(columns='Number of Uses', ascending=True).plot(kind='bar', legend=None) 

# labels the x and y axes 
my_plot.set_xlabel('Bicycles') 
my_plot.set_ylabel('Number of Rides') 

# sets the labels along the x-axis as the names of each liquor 
my_plot.set_xticklabels(b, rotation=45, horizontalalignment='right') 

# displays the graph 
plt.show() 

Второй набор кода используется тот же набор данных в качестве первого набора кода, и был изменен от оригинала, чтобы соответствовать CITI данных велосипеда. Мой google-fu исчерпан. Я пробовал переформатировать xticks, добавив куски второго кода в первый код, добавив куски первого кода ко второму и т. Д. Возможно, что-то смотрело мне прямо в лицо, но я не вижу его. Любая помощь приветствуется.

+0

Потому что 'участок (B, C)' участки 'b' против' c'. Если вы хотите построить их по заказу аттракционов, используйте xaxis, который является их отсортированным номером. – tacaswell

+0

Я хочу построить их так, чтобы идентификаторы велосипедов были на оси x и остались в том порядке, в котором они находятся в файле csv. В файле они находятся в порядке наименее ездившегося байка до самого рейда. Однако, когда они построены на графике, они сортируются по порядку, а не по наименьшей степени. Где-то в коде система заказов переключается. –

ответ

4

Вы хотите построить только количество применений с использованием функции построения графика, а затем установите x-метки на идентификационные номера велосипеда. Поэтому, когда вы планируете, не включайте идентификационные номера велосипеда. Просто сделайте plt.plot (c). Если вы даете функции plot только один аргумент, он сам создает сами значения x, в данном случае в качестве диапазона (len (c)). Затем вы можете изменить метки на оси x на идентификаторы велосипедов. Это делается с помощью plt.xticks. Вам нужно передать ему список x-значений, которые он создал, и список меток. Таким образом, это будет plt.xticks (range (len (c)), b).

Попробуйте это:

import pandas as pd 
import matplotlib.pyplot as plt 

# read in the file and separate it into two lists 
a = pd.read_csv('Sorted_Bike_Uses.csv', header=0) 
b = a['Bike ID'] 
c = a['Number of Uses'] 

# create the graph 
plt.plot(c) 

# label the x and y axes 
plt.xlabel('Bicycles', weight='bold', size='large') 
plt.ylabel('Number of Rides', weight='bold', size='large') 

# format the x and y ticks 
plt.xticks(range(len(c)), b, rotation=50, horizontalalignment='right', weight='bold', size='large') 
plt.yticks(weight='bold', size='large') 

# give it a title 
plt.title("Top Ten Bicycles (by # of uses)", weight='bold') 

# displays the graph 
plt.show() 
+0

Он работает! Спасибо за помощь! –

3

Если вы используете .plot метод pandas.DataFrame, просто возьмите результирующую axis и set_xticklables:

a = pd.DataFrame({'Bike ID': [5454, 3432, 4432, 3314], 
        'Number of Uses': [11, 23, 5, 9]}) 
a.sort(columns='Number of Uses', inplace=True) 
ax = a.plot(y='Number of Uses', kind='bar') 
_ = ax.set_xticklabels(a['Bike ID']) 

enter image description here

+0

Неверный порядок на графике. 3432 имеет 23, а не 9, как предлагает диаграмма. –

Смежные вопросы