|
From: Tommy C. <tom...@gm...> - 2015-02-14 19:18:53
|
Ryan, my use case is indeed that I want to avoid overlapping ticks and I want to avoid them by not displaying them. Here is a guy with the same problem: http://stackoverflow.com/questions/9422587/overlapping-y-axis-tick-label-and-x-axis-tick-label-in-matplotlib Here is the problem at the top left of my plot: www.tommycarstensen.com/matplotlib.png I'll just set the ticks manually. Sadly seems like the easiest thing to do. On Sat, Feb 14, 2015 at 7:01 PM, Ryan Nelson <rne...@gm...> wrote: > Tommy, > > I'm sorry. I forgot to hit send all *again*. Below is my original message, > but the function I wrote is updated because it wasn't exactly correct.... > > Ah. I was working on something to help out, so I'm just seeing Eric's very > elegant solution, which I have yet to try. However, I feel like you might > run into some problems if you always drop the first tick. For example, try > this plot: > ______________ > import matplotlib.pyplot as plt > from matplotlib.ticker import MultipleLocator > import numpy as np > xs = np.linspace(2,12,1000) > ys = np.sin(xs) > n = 5 > fig = plt.figure() > ax1 = fig.add_subplot(111) > ax1.plot(xs, ys) > ax1.xaxis.set_major_locator(MultipleLocator(5)) > plt.show() > _____________ > In this case, dropping the first tick will result in only one tick on the > screen. > > What is your use-case? Are you annoyed that the axis labels are overlapping > at the far left? If that's the case, here's a little function (trimticks) > that I whipped up that might help. It drops the far left or far right label > if it is exactly at the edge of the axes. Should work for y axes as well. > _____________ > def trimticks(ax, n=5): > xmin, xmax = ax.get_xlim() > if xmin%n == 0: > xmin = xmin+n > else: > xmin = xmin + n - xmin%n > > if not xmax%n == 0: > xmax = xmax + n - xmax%n > > ticks = np.arange(xmin, xmax, n) > ax.set_xticks(ticks) > > import matplotlib.pyplot as plt > from matplotlib.ticker import MultipleLocator > import numpy as np > xs = np.linspace(0,20,10000) > ys = np.sin(xs) > fig = plt.figure() > ax1 = fig.add_subplot(111) > ax1.plot(xs, ys) > trimticks(ax1) > plt.show() > > ___________________ > > > On Sat, Feb 14, 2015 at 1:45 PM, Tommy Carstensen > <tom...@gm...> wrote: >> >> Erik, that doesn't seem to work either. I tried this: >> >> import matplotlib.pyplot as plt >> from matplotlib.ticker import MultipleLocator >> class TrimmedMultipleLocator(MultipleLocator): >> def tick_values(self, vmin, vmax): >> return MultipleLocator.tick_values(self, vmin, vmax)[2:] >> fig = plt.figure() >> ax1 = fig.add_subplot(111) >> ax1.xaxis.set_major_locator(TrimmedMultipleLocator(5)) >> #xticks[0].label1.set_visible(False) >> #xticks[-1].label1.set_visible(False) >> #ax1.set_xticks(ax1.xaxis.get_major_ticks()[1:-1]) >> ax1.plot(list(range(21))) >> plt.show() >> >> Here is an example of the use of prune='lower', but it does not allow >> one to set the tick step size: >> >> http://stackoverflow.com/questions/9422587/overlapping-y-axis-tick-label-and-x-axis-tick-label-in-matplotlib >> >> I think my best bet is to just set those ticks manually. >> >> On Sat, Feb 14, 2015 at 6:19 PM, Eric Firing <ef...@ha...> wrote: >> > On 2015/02/14 7:33 AM, Tommy Carstensen wrote: >> >> Thanks again Ryan. That's exactly what I want to achieve; i.e. remove >> >> the tick at 0 and only keep 5 and 10. Your solution works, but it's a >> >> bit of hack to use magic constants. I could however get those values >> >> from the xlim. >> >> >> >> Eric, I would describe the desired tick placement algorithm as >> >> removing the first tick on the axis. It can be achieved like this: >> >> ax1.xaxis.set_major_locator(MaxNLocator(prune='lower')) >> > >> > Aha! The problem is that the MaxNLocator is the only one with the prune >> > kwarg. It could be added to the MultipleLocator. For now, though, you >> > can make your own specialized Locator, hardwired to omit the first tick, >> > like this: >> > >> > from matplotlib.ticker import MultipleLocator >> > >> > class TrimmedMultipleLocator(MultipleLocator): >> > def tick_values(self, vmin, vmax): >> > return MultipleLocator.tick_values(self, vmin, vmax)[1:] >> > >> > then just use >> > >> > ax1.xaxis.set_major_locator(TrimmedMultipleLocator(5)) >> > >> > I haven't tested it--but give it a try. What it is doing is making a >> > subclass of MultipleLocator, and altering only the one little bit of its >> > behavior that you want to modify. Everything else is automatically >> > inherited from the base class, MultipleLocator. >> > >> > Eric >> > >> > >> >> >> >> But that then overrides this: >> >> ax1.xaxis.set_major_locator(MultipleLocator(5)) >> >> >> >> On Sat, Feb 14, 2015 at 5:27 PM, Ryan Nelson <rne...@gm...> >> >> wrote: >> >>> Tommy, (Sorry for the doubleup. I just realized I forgot to hit >> >>> reply-all.) >> >>> >> >>> Do you want to remove the tick at 0 and only have 5,10, etc.? Could >> >>> you just >> >>> do something like this instead: >> >>> >> >>> import matplotlib.pyplot as plt >> >>> from matplotlib.ticker import MultipleLocator >> >>> fig = plt.figure() >> >>> ax1 = fig.add_subplot(111) >> >>> ax1.set_xticks(range(5,11,5)) >> >>> ax1.plot(range(11)) >> >>> plt.show() >> >>> >> >>> Ryan >> >>> >> >>> >> >>> On Sat, Feb 14, 2015 at 10:47 AM, Tommy Carstensen >> >>> <tom...@gm...> wrote: >> >>>> >> >>>> Thanks for you answer Eric. I had to get some sleep before trying out >> >>>> things. I currently have the code below, but it does not remove the >> >>>> zero value tick. It removes the tick at 5 and 10 however. >> >>>> >> >>>> import matplotlib.pyplot as plt >> >>>> from matplotlib.ticker import MultipleLocator >> >>>> fig = plt.figure() >> >>>> ax1 = fig.add_subplot(111) >> >>>> ax1.xaxis.set_major_locator(MultipleLocator(5)) >> >>>> xticks = ax1.xaxis.get_major_ticks() >> >>>> #xticks[0].label1.set_visible(False) >> >>>> #xticks[-1].label1.set_visible(False) >> >>>> ax1.set_xticks(ax1.get_xticks()[1:-1]) >> >>>> ax1.plot(list(range(11))) >> >>>> plt.show() >> >>>> >> >>>> On Sat, Feb 14, 2015 at 2:01 AM, Eric Firing <ef...@ha...> >> >>>> wrote: >> >>>>> On 2015/02/13 3:29 PM, Tommy Carstensen wrote: >> >>>>>> Is it possible to combine MultipleLocator and MaxNLocator? One >> >>>>>> seems >> >>>>>> to erase the effect of the other. >> >>>>> >> >>>>> They are for different situations. MultipleLocator is for when you >> >>>>> know >> >>>>> what you want your tick interval to be; MaxNLocator is for when you >> >>>>> don't know that, but you do know roughly how many ticks you want, >> >>>>> and >> >>>>> what sort of numerical intervals are acceptable. >> >>>>> >> >>>>> Eric >> >>>>> >> >>>>> >> >>>>> >> >>>>> >> >>>>> ------------------------------------------------------------------------------ >> >>>>> Dive into the World of Parallel Programming. The Go Parallel >> >>>>> Website, >> >>>>> sponsored by Intel and developed in partnership with Slashdot Media, >> >>>>> is >> >>>>> your >> >>>>> hub for all things parallel software development, from weekly >> >>>>> thought >> >>>>> leadership blogs to news, videos, case studies, tutorials and more. >> >>>>> Take >> >>>>> a >> >>>>> look and join the conversation now. >> >>>>> http://goparallel.sourceforge.net/ >> >>>>> _______________________________________________ >> >>>>> Matplotlib-users mailing list >> >>>>> Mat...@li... >> >>>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >> >>>> >> >>>> >> >>>> >> >>>> ------------------------------------------------------------------------------ >> >>>> Dive into the World of Parallel Programming. The Go Parallel Website, >> >>>> sponsored by Intel and developed in partnership with Slashdot Media, >> >>>> is >> >>>> your >> >>>> hub for all things parallel software development, from weekly thought >> >>>> leadership blogs to news, videos, case studies, tutorials and more. >> >>>> Take a >> >>>> look and join the conversation now. >> >>>> http://goparallel.sourceforge.net/ >> >>>> _______________________________________________ >> >>>> Matplotlib-users mailing list >> >>>> Mat...@li... >> >>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >> >>> >> >>> >> >> >> >> >> >> ------------------------------------------------------------------------------ >> >> Dive into the World of Parallel Programming. The Go Parallel Website, >> >> sponsored by Intel and developed in partnership with Slashdot Media, is >> >> your >> >> hub for all things parallel software development, from weekly thought >> >> leadership blogs to news, videos, case studies, tutorials and more. >> >> Take a >> >> look and join the conversation now. http://goparallel.sourceforge.net/ >> >> _______________________________________________ >> >> Matplotlib-users mailing list >> >> Mat...@li... >> >> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >> >> >> > >> > >> > >> > ------------------------------------------------------------------------------ >> > Dive into the World of Parallel Programming. The Go Parallel Website, >> > sponsored by Intel and developed in partnership with Slashdot Media, is >> > your >> > hub for all things parallel software development, from weekly thought >> > leadership blogs to news, videos, case studies, tutorials and more. Take >> > a >> > look and join the conversation now. http://goparallel.sourceforge.net/ >> > _______________________________________________ >> > Matplotlib-users mailing list >> > Mat...@li... >> > https://lists.sourceforge.net/lists/listinfo/matplotlib-users >> >> >> ------------------------------------------------------------------------------ >> Dive into the World of Parallel Programming. The Go Parallel Website, >> sponsored by Intel and developed in partnership with Slashdot Media, is >> your >> hub for all things parallel software development, from weekly thought >> leadership blogs to news, videos, case studies, tutorials and more. Take a >> look and join the conversation now. http://goparallel.sourceforge.net/ >> _______________________________________________ >> Matplotlib-users mailing list >> Mat...@li... >> https://lists.sourceforge.net/lists/listinfo/matplotlib-users > > > > ------------------------------------------------------------------------------ > Dive into the World of Parallel Programming. The Go Parallel Website, > sponsored by Intel and developed in partnership with Slashdot Media, is your > hub for all things parallel software development, from weekly thought > leadership blogs to news, videos, case studies, tutorials and more. Take a > look and join the conversation now. http://goparallel.sourceforge.net/ > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > |