mindste værdi af y-aksen ikke anvendes i matplotlib vlines plot

Jeg gør en vlines plot i matplotlib, og jeg har alle mine y-værdier i datasættet, som >=0. Jeg ønsker, at min y-aksen i bunden mest kryds for at læse 0, men i stedet, får jeg -500.

Her er koden:

#!/usr/bin/env python

import numpy as np
from matplotlib import pyplot as plt, dates as mdates
import datetime as dt, time

# Read the data and turn it into a numpy array
#store = map(lambda line: map(int, line.strip().split()), open(name + '.txt').readlines())
store = [
    [1293606162197, 0, 0],
    [1293605477994, 63, 0],
    [1293605478057, 0, 0],
    [1293605478072, 2735, 1249],
    [1293606162213, 0, 0],
    [1293606162229, 0, 0],
]

nstore = np.array(store)

# Get arrays of each columns in the store array
d = nstore[:,0]
y1 = nstore[:,1]
y2 = nstore[:,2]

# Get arrays of values to be passed to matplotlib
s = d / 1000
dts = map(dt.datetime.fromtimestamp, s)
fds = mdates.date2num(dts)

# new figure and subplot
fig = plt.figure()
ax = fig.add_subplot(111)

# Plot using vlines
ax.vlines(fds, [0], y1, 'red')

# set xaxis tick settings
ax.xaxis.set_major_locator(mdates.MinuteLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d %H:%M'))

for label in ax.xaxis.get_ticklabels():
    label.set_rotation('vertical')

fig.subplots_adjust(bottom=.25)

# Set the y axis bottom limit to 0
ax.set_ylim(bottom=0)   # <<- THIS DOES NOT SEEM TO BE WORKING

# Save the plot figure
fig.savefig('out.png')

og her er plottet, får jeg:
mindste værdi af y-aksen ikke anvendes i matplotlib vlines plot

Kan nogen pege på mig, hvad jeg gør forkert? Også, hvis du kan pege mig til de dokumenter, som har de oplysninger, jeg har brug for, ville det være fantastisk. Tak.

Spørgsmålet er en opfølgning af At skabe graf med dato og tid i aksen etiketter med matplotlib

OriginalForfatteren Shrikant Sharat | 2011-04-05

1 svar

  1. 21

    Du kan sætte grænsen manuelt efter at plotte data, som så:

    pyplot.ylim(ymin=0)

    Hvad der sker, er, at Matplotlib justerer plot grænser, så det ser “bedste”. Nogle gange, denne indebærer, at gå ud over den strengt udvalg af dine data. Derefter skal du opdatere grænser efter plottet, da hver plot opdateringer grænsen (hvis jeg forstår det rigtigt).

    Nu, din tilgang kan arbejde, men du skal opdatere figur efter indstilling af grænser:

    ax.set_ylim(bottom=0)
    pylot.draw()

    (Dette virker i IPython shell på Mac OS X med den nyeste version af matplotlib.)

    ah, tak EOL, der får det til at virke. Er der en tilsvarende af denne metode i et objekt orienteret stil, som jeg vil gøre mange parceller i parallel.
    Jeg har tilføjet en objekt-orienteret tilgang til mine svar.
    Jeg får en TypeError: draw_wrapper() takes at least 2 arguments (1 given) med ax.draw(), der kører på Ubuntu.
    Oh boy! Jeg fik det regnede, skiftende ax.set_ylim(bottom=0) at ax.set_ylim(ymin=0) fungerer som en charme, uden behov for en opfordring til at .draw(). Tak
    For the record: ax.set_ylim(ymin=…) er gamle syntaks og er erstattet af den bottom=… af svaret.

    OriginalForfatteren Eric O Lebigot

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *