диапазон осей в точечных диаграммах

Я использовал приведенный ниже код для построения графика времени, затрачиваемого на выполнение 4 функций. Ось x представляет количество выполнений, тогда как ось y представляет время, затраченное на выполнение функции.

Мне было интересно, не могли бы вы помочь мне выполнить следующее:

1) установите пределы оси x так, чтобы отображались только положительные значения (x представляет количество раз, когда каждая функция выполнялась, и поэтому всегда положительна)

2) создать легенду для 4 функций

Спасибо,

Отметка

import matplotlib
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.mlab as mlab


r = mlab.csv2rec('performance.csv')

fig = Figure(figsize=(9,6))

canvas = FigureCanvas(fig)

ax = fig.add_subplot(111)

ax.set_title("Function performance",fontsize=14)

ax.set_xlabel("code executions",fontsize=12)

ax.set_ylabel("time(s)",fontsize=12)

ax.grid(True,linestyle='-',color='0.75')

ax.scatter(r.run,r.function1,s=10,color='tomato');
ax.scatter(r.run,r.function2,s=10,color='violet');
ax.scatter(r.run,r.function3,s=10,color='blue');
ax.scatter(r.run,r.function4,s=10,color='green');

canvas.print_figure('performance.png',dpi=700)

person Mark    schedule 11.09.2011    source источник
comment
С какой проблемой вы сталкиваетесь, когда пытаетесь сделать это самостоятельно? Вы не знаете, как установить пределы осей или создать легенду? (на оба вопроса легко ответить, выполнив поиск в документации) Пробовали ли вы это и получили сообщение об ошибке?   -  person David Z    schedule 11.09.2011
comment
Привет, Дэвид! Спасибо за твое сообщение. Я пытался установить ограничение по оси x с помощью ax.xlim([0,150]), но это приводит к следующему сообщению об ошибке: AttributeError: объект «AxesSubplot» не имеет атрибута «xlim». Я не уверен, что использование scatter() даст мне гибкость для работы с ограничениями по осям.   -  person Mark    schedule 11.09.2011
comment
Что касается легенды, я использовал это: ax.scatter(r.run,r.time,s=10,color='tomato', marker='o',label='function1'), но в файле png ничего не появилось.   -  person Mark    schedule 11.09.2011
comment
@Mark - Вы хотите ax.set_xlim(..), а не ax.xlim. Кроме того, вам не нужен разброс для того, что вы делаете в этом конкретном случае. plot будет иметь больше смысла. Разброс предназначен для изменения цветов и/или размеров маркеров с помощью 3-й и/или 4-й переменной. В вашем случае ax.plot(r.run, r.function1, 'o', color='whatever') будет иметь больше смысла.   -  person Joe Kington    schedule 11.09.2011
comment
Спасибо за ваше время и терпение! :)   -  person Mark    schedule 15.09.2011
comment
Вы должны поблагодарить его, отметив его ответ как правильный. ;)   -  person Carl F.    schedule 18.09.2011


Ответы (1)


Вам нужно вызвать legend, чтобы появилась легенда. label kwarg устанавливает только атрибут _label для рассматриваемого объекта исполнителя. Это сделано для удобства, чтобы метка в легенде могла быть четко связана с командой построения графика. Он не добавит легенду на график без явного вызова ax.legend(...). Кроме того, вы хотите, чтобы ax.set_xlim, а не ax.xlim регулировали пределы по оси x. Взгляните также на ax.axis.

Похоже, вы хотите что-то вроде этого:

import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt
import numpy as np

# Generate some data
x = np.arange(0, 22, 2)
f1, f2, f3, f4 = np.cumsum(np.random.random((4, x.size)) - 0.5, axis=1)

# It's much more convenient to just use pyplot's factory functions...
fig, ax = plt.subplots()

ax.set_title("Function performance",fontsize=14)
ax.set_xlabel("code executions",fontsize=12)
ax.set_ylabel("time(s)",fontsize=12)
ax.grid(True,linestyle='-',color='0.75')

colors = ['tomato', 'violet', 'blue', 'green']
labels = ['Thing One', 'Thing Two', 'Thing Three', 'Thing Four']
for func, color, label in zip([f1, f2, f3, f4], colors, labels):
    ax.plot(x, func, 'o', color=color, markersize=10, label=label)

ax.legend(numpoints=1, loc='upper left')
ax.set_xlim([0, x.max() + 1])

fig.savefig('performance.png', dpi=100)

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

person Joe Kington    schedule 11.09.2011