开发者

minimum value of y axis is not being applied in matplotlib vlines plot

开发者 https://www.devze.com 2023-02-22 06:21 出处:网络
I am doing a vlines plot in matplotlib and I have all my y values in the dataset as >=0. I want my y axis bottom most tick to read 0, but instead, I get -500.

I am doing a vlines plot in matplotlib and I have all my y values in the dataset as >=0. I want my y axis bottom most tick to read 0, but instead, I get -500.

Here is the code:

#!/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, 124开发者_开发问答9],
    [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')

and here is the plot I get:

minimum value of y axis is not being applied in matplotlib vlines plot

Can anyone point to me what I am doing wrong? Also, if you can point me to the docs that have the details I need, that would be great. Thanks.

Question is a follow up of Creating graph with date and time in axis labels with matplotlib


You can set the limit manually after plotting the data, like so:

pyplot.ylim(ymin=0)

What happens is that Matplotlib adjusts the plot limits so that it looks "best". Sometimes, this implies going beyond the strict range of your data. You must then update the limits after the plot, since each plot updates the limit (if I understand correctly).

Now, your approach can work, but you must update the figure after setting the limits:

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

(This works in the IPython shell on Mac OS X with the latest version of matplotlib.)

0

精彩评论

暂无评论...
验证码 换一张
取 消