123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- import contextlib
- from io import StringIO
- import matplotlib as mpl
- import matplotlib.pyplot as plt
- import numpy as np
- import pytest
- from cycler import cycler
- def test_colorcycle_basic():
- fig, ax = plt.subplots()
- ax.set_prop_cycle(cycler('color', ['r', 'g', 'y']))
- for _ in range(4):
- ax.plot(range(10), range(10))
- assert [l.get_color() for l in ax.lines] == ['r', 'g', 'y', 'r']
- def test_marker_cycle():
- fig, ax = plt.subplots()
- ax.set_prop_cycle(cycler('c', ['r', 'g', 'y']) +
- cycler('marker', ['.', '*', 'x']))
- for _ in range(4):
- ax.plot(range(10), range(10))
- assert [l.get_color() for l in ax.lines] == ['r', 'g', 'y', 'r']
- assert [l.get_marker() for l in ax.lines] == ['.', '*', 'x', '.']
- def test_marker_cycle_kwargs_arrays_iterators():
- fig, ax = plt.subplots()
- ax.set_prop_cycle(c=np.array(['r', 'g', 'y']),
- marker=iter(['.', '*', 'x']))
- for _ in range(4):
- ax.plot(range(10), range(10))
- assert [l.get_color() for l in ax.lines] == ['r', 'g', 'y', 'r']
- assert [l.get_marker() for l in ax.lines] == ['.', '*', 'x', '.']
- def test_linestylecycle_basic():
- fig, ax = plt.subplots()
- ax.set_prop_cycle(cycler('ls', ['-', '--', ':']))
- for _ in range(4):
- ax.plot(range(10), range(10))
- assert [l.get_linestyle() for l in ax.lines] == ['-', '--', ':', '-']
- def test_fillcycle_basic():
- fig, ax = plt.subplots()
- ax.set_prop_cycle(cycler('c', ['r', 'g', 'y']) +
- cycler('hatch', ['xx', 'O', '|-']) +
- cycler('linestyle', ['-', '--', ':']))
- for _ in range(4):
- ax.fill(range(10), range(10))
- assert ([p.get_facecolor() for p in ax.patches]
- == [mpl.colors.to_rgba(c) for c in ['r', 'g', 'y', 'r']])
- assert [p.get_hatch() for p in ax.patches] == ['xx', 'O', '|-', 'xx']
- assert [p.get_linestyle() for p in ax.patches] == ['-', '--', ':', '-']
- def test_fillcycle_ignore():
- fig, ax = plt.subplots()
- ax.set_prop_cycle(cycler('color', ['r', 'g', 'y']) +
- cycler('hatch', ['xx', 'O', '|-']) +
- cycler('marker', ['.', '*', 'D']))
- t = range(10)
- # Should not advance the cycler, even though there is an
- # unspecified property in the cycler "marker".
- # "marker" is not a Polygon property, and should be ignored.
- ax.fill(t, t, 'r', hatch='xx')
- # Allow the cycler to advance, but specify some properties
- ax.fill(t, t, hatch='O')
- ax.fill(t, t)
- ax.fill(t, t)
- assert ([p.get_facecolor() for p in ax.patches]
- == [mpl.colors.to_rgba(c) for c in ['r', 'r', 'g', 'y']])
- assert [p.get_hatch() for p in ax.patches] == ['xx', 'O', 'O', '|-']
- def test_property_collision_plot():
- fig, ax = plt.subplots()
- ax.set_prop_cycle('linewidth', [2, 4])
- t = range(10)
- for c in range(1, 4):
- ax.plot(t, t, lw=0.1)
- ax.plot(t, t)
- ax.plot(t, t)
- assert [l.get_linewidth() for l in ax.lines] == [0.1, 0.1, 0.1, 2, 4]
- def test_property_collision_fill():
- fig, ax = plt.subplots()
- ax.set_prop_cycle(linewidth=[2, 3, 4, 5, 6], facecolor='bgcmy')
- t = range(10)
- for c in range(1, 4):
- ax.fill(t, t, lw=0.1)
- ax.fill(t, t)
- ax.fill(t, t)
- assert ([p.get_facecolor() for p in ax.patches]
- == [mpl.colors.to_rgba(c) for c in 'bgcmy'])
- assert [p.get_linewidth() for p in ax.patches] == [0.1, 0.1, 0.1, 5, 6]
- def test_valid_input_forms():
- fig, ax = plt.subplots()
- # These should not raise an error.
- ax.set_prop_cycle(None)
- ax.set_prop_cycle(cycler('linewidth', [1, 2]))
- ax.set_prop_cycle('color', 'rgywkbcm')
- ax.set_prop_cycle('lw', (1, 2))
- ax.set_prop_cycle('linewidth', [1, 2])
- ax.set_prop_cycle('linewidth', iter([1, 2]))
- ax.set_prop_cycle('linewidth', np.array([1, 2]))
- ax.set_prop_cycle('color', np.array([[1, 0, 0],
- [0, 1, 0],
- [0, 0, 1]]))
- ax.set_prop_cycle('dashes', [[], [13, 2], [8, 3, 1, 3]])
- ax.set_prop_cycle(lw=[1, 2], color=['k', 'w'], ls=['-', '--'])
- ax.set_prop_cycle(lw=np.array([1, 2]),
- color=np.array(['k', 'w']),
- ls=np.array(['-', '--']))
- def test_cycle_reset():
- fig, ax = plt.subplots()
- prop0 = StringIO()
- prop1 = StringIO()
- prop2 = StringIO()
- with contextlib.redirect_stdout(prop0):
- plt.getp(ax.plot([1, 2], label="label")[0])
- ax.set_prop_cycle(linewidth=[10, 9, 4])
- with contextlib.redirect_stdout(prop1):
- plt.getp(ax.plot([1, 2], label="label")[0])
- assert prop1.getvalue() != prop0.getvalue()
- ax.set_prop_cycle(None)
- with contextlib.redirect_stdout(prop2):
- plt.getp(ax.plot([1, 2], label="label")[0])
- assert prop2.getvalue() == prop0.getvalue()
- def test_invalid_input_forms():
- fig, ax = plt.subplots()
- with pytest.raises((TypeError, ValueError)):
- ax.set_prop_cycle(1)
- with pytest.raises((TypeError, ValueError)):
- ax.set_prop_cycle([1, 2])
- with pytest.raises((TypeError, ValueError)):
- ax.set_prop_cycle('color', 'fish')
- with pytest.raises((TypeError, ValueError)):
- ax.set_prop_cycle('linewidth', 1)
- with pytest.raises((TypeError, ValueError)):
- ax.set_prop_cycle('linewidth', {1, 2})
- with pytest.raises((TypeError, ValueError)):
- ax.set_prop_cycle(linewidth=1, color='r')
- with pytest.raises((TypeError, ValueError)):
- ax.set_prop_cycle('foobar', [1, 2])
- with pytest.raises((TypeError, ValueError)):
- ax.set_prop_cycle(foobar=[1, 2])
- with pytest.raises((TypeError, ValueError)):
- ax.set_prop_cycle(cycler(foobar=[1, 2]))
- with pytest.raises(ValueError):
- ax.set_prop_cycle(cycler(color='rgb', c='cmy'))
|