| """ Test cases for misc plot functions """ |
| import os |
|
|
| import numpy as np |
| import pytest |
|
|
| import pandas.util._test_decorators as td |
|
|
| from pandas import ( |
| DataFrame, |
| Index, |
| Series, |
| Timestamp, |
| date_range, |
| interval_range, |
| period_range, |
| plotting, |
| read_csv, |
| ) |
| import pandas._testing as tm |
| from pandas.tests.plotting.common import ( |
| _check_colors, |
| _check_legend_labels, |
| _check_plot_works, |
| _check_text_labels, |
| _check_ticks_props, |
| ) |
|
|
| mpl = pytest.importorskip("matplotlib") |
| plt = pytest.importorskip("matplotlib.pyplot") |
| cm = pytest.importorskip("matplotlib.cm") |
|
|
|
|
| @pytest.fixture |
| def iris(datapath) -> DataFrame: |
| """ |
| The iris dataset as a DataFrame. |
| """ |
| return read_csv(datapath("io", "data", "csv", "iris.csv")) |
|
|
|
|
| @td.skip_if_installed("matplotlib") |
| def test_import_error_message(): |
| |
| df = DataFrame({"A": [1, 2]}) |
|
|
| with pytest.raises(ImportError, match="matplotlib is required for plotting"): |
| df.plot() |
|
|
|
|
| def test_get_accessor_args(): |
| func = plotting._core.PlotAccessor._get_call_args |
|
|
| msg = "Called plot accessor for type list, expected Series or DataFrame" |
| with pytest.raises(TypeError, match=msg): |
| func(backend_name="", data=[], args=[], kwargs={}) |
|
|
| msg = "should not be called with positional arguments" |
| with pytest.raises(TypeError, match=msg): |
| func(backend_name="", data=Series(dtype=object), args=["line", None], kwargs={}) |
|
|
| x, y, kind, kwargs = func( |
| backend_name="", |
| data=DataFrame(), |
| args=["x"], |
| kwargs={"y": "y", "kind": "bar", "grid": False}, |
| ) |
| assert x == "x" |
| assert y == "y" |
| assert kind == "bar" |
| assert kwargs == {"grid": False} |
|
|
| x, y, kind, kwargs = func( |
| backend_name="pandas.plotting._matplotlib", |
| data=Series(dtype=object), |
| args=[], |
| kwargs={}, |
| ) |
| assert x is None |
| assert y is None |
| assert kind == "line" |
| assert len(kwargs) == 24 |
|
|
|
|
| @pytest.mark.parametrize("kind", plotting.PlotAccessor._all_kinds) |
| @pytest.mark.parametrize( |
| "data", [DataFrame(np.arange(15).reshape(5, 3)), Series(range(5))] |
| ) |
| @pytest.mark.parametrize( |
| "index", |
| [ |
| Index(range(5)), |
| date_range("2020-01-01", periods=5), |
| period_range("2020-01-01", periods=5), |
| ], |
| ) |
| def test_savefig(kind, data, index): |
| fig, ax = plt.subplots() |
| data.index = index |
| kwargs = {} |
| if kind in ["hexbin", "scatter", "pie"]: |
| if isinstance(data, Series): |
| pytest.skip(f"{kind} not supported with Series") |
| kwargs = {"x": 0, "y": 1} |
| data.plot(kind=kind, ax=ax, **kwargs) |
| fig.savefig(os.devnull) |
|
|
|
|
| class TestSeriesPlots: |
| def test_autocorrelation_plot(self): |
| from pandas.plotting import autocorrelation_plot |
|
|
| ser = Series( |
| np.arange(10, dtype=np.float64), |
| index=date_range("2020-01-01", periods=10), |
| name="ts", |
| ) |
| |
| with tm.assert_produces_warning(None): |
| _check_plot_works(autocorrelation_plot, series=ser) |
| _check_plot_works(autocorrelation_plot, series=ser.values) |
|
|
| ax = autocorrelation_plot(ser, label="Test") |
| _check_legend_labels(ax, labels=["Test"]) |
|
|
| @pytest.mark.parametrize("kwargs", [{}, {"lag": 5}]) |
| def test_lag_plot(self, kwargs): |
| from pandas.plotting import lag_plot |
|
|
| ser = Series( |
| np.arange(10, dtype=np.float64), |
| index=date_range("2020-01-01", periods=10), |
| name="ts", |
| ) |
| _check_plot_works(lag_plot, series=ser, **kwargs) |
|
|
| def test_bootstrap_plot(self): |
| from pandas.plotting import bootstrap_plot |
|
|
| ser = Series( |
| np.arange(10, dtype=np.float64), |
| index=date_range("2020-01-01", periods=10), |
| name="ts", |
| ) |
| _check_plot_works(bootstrap_plot, series=ser, size=10) |
|
|
|
|
| class TestDataFramePlots: |
| @pytest.mark.parametrize("pass_axis", [False, True]) |
| def test_scatter_matrix_axis(self, pass_axis): |
| pytest.importorskip("scipy") |
| scatter_matrix = plotting.scatter_matrix |
|
|
| ax = None |
| if pass_axis: |
| _, ax = mpl.pyplot.subplots(3, 3) |
|
|
| df = DataFrame(np.random.default_rng(2).standard_normal((100, 3))) |
|
|
| |
| with tm.assert_produces_warning(UserWarning, check_stacklevel=False): |
| axes = _check_plot_works( |
| scatter_matrix, |
| frame=df, |
| range_padding=0.1, |
| ax=ax, |
| ) |
| axes0_labels = axes[0][0].yaxis.get_majorticklabels() |
| |
| expected = ["-2", "0", "2"] |
| _check_text_labels(axes0_labels, expected) |
| _check_ticks_props(axes, xlabelsize=8, xrot=90, ylabelsize=8, yrot=0) |
|
|
| @pytest.mark.parametrize("pass_axis", [False, True]) |
| def test_scatter_matrix_axis_smaller(self, pass_axis): |
| pytest.importorskip("scipy") |
| scatter_matrix = plotting.scatter_matrix |
|
|
| ax = None |
| if pass_axis: |
| _, ax = mpl.pyplot.subplots(3, 3) |
|
|
| df = DataFrame(np.random.default_rng(11).standard_normal((100, 3))) |
| df[0] = (df[0] - 2) / 3 |
|
|
| |
| with tm.assert_produces_warning(UserWarning, check_stacklevel=False): |
| axes = _check_plot_works( |
| scatter_matrix, |
| frame=df, |
| range_padding=0.1, |
| ax=ax, |
| ) |
| axes0_labels = axes[0][0].yaxis.get_majorticklabels() |
| expected = ["-1.0", "-0.5", "0.0"] |
| _check_text_labels(axes0_labels, expected) |
| _check_ticks_props(axes, xlabelsize=8, xrot=90, ylabelsize=8, yrot=0) |
|
|
| @pytest.mark.slow |
| def test_andrews_curves_no_warning(self, iris): |
| from pandas.plotting import andrews_curves |
|
|
| df = iris |
| |
| with tm.assert_produces_warning(None): |
| _check_plot_works(andrews_curves, frame=df, class_column="Name") |
|
|
| @pytest.mark.slow |
| @pytest.mark.parametrize( |
| "linecolors", |
| [ |
| ("#556270", "#4ECDC4", "#C7F464"), |
| ["dodgerblue", "aquamarine", "seagreen"], |
| ], |
| ) |
| @pytest.mark.parametrize( |
| "df", |
| [ |
| "iris", |
| DataFrame( |
| { |
| "A": np.random.default_rng(2).standard_normal(10), |
| "B": np.random.default_rng(2).standard_normal(10), |
| "C": np.random.default_rng(2).standard_normal(10), |
| "Name": ["A"] * 10, |
| } |
| ), |
| ], |
| ) |
| def test_andrews_curves_linecolors(self, request, df, linecolors): |
| from pandas.plotting import andrews_curves |
|
|
| if isinstance(df, str): |
| df = request.getfixturevalue(df) |
| ax = _check_plot_works( |
| andrews_curves, frame=df, class_column="Name", color=linecolors |
| ) |
| _check_colors( |
| ax.get_lines()[:10], linecolors=linecolors, mapping=df["Name"][:10] |
| ) |
|
|
| @pytest.mark.slow |
| @pytest.mark.parametrize( |
| "df", |
| [ |
| "iris", |
| DataFrame( |
| { |
| "A": np.random.default_rng(2).standard_normal(10), |
| "B": np.random.default_rng(2).standard_normal(10), |
| "C": np.random.default_rng(2).standard_normal(10), |
| "Name": ["A"] * 10, |
| } |
| ), |
| ], |
| ) |
| def test_andrews_curves_cmap(self, request, df): |
| from pandas.plotting import andrews_curves |
|
|
| if isinstance(df, str): |
| df = request.getfixturevalue(df) |
| cmaps = [cm.jet(n) for n in np.linspace(0, 1, df["Name"].nunique())] |
| ax = _check_plot_works( |
| andrews_curves, frame=df, class_column="Name", color=cmaps |
| ) |
| _check_colors(ax.get_lines()[:10], linecolors=cmaps, mapping=df["Name"][:10]) |
|
|
| @pytest.mark.slow |
| def test_andrews_curves_handle(self): |
| from pandas.plotting import andrews_curves |
|
|
| colors = ["b", "g", "r"] |
| df = DataFrame({"A": [1, 2, 3], "B": [1, 2, 3], "C": [1, 2, 3], "Name": colors}) |
| ax = andrews_curves(df, "Name", color=colors) |
| handles, _ = ax.get_legend_handles_labels() |
| _check_colors(handles, linecolors=colors) |
|
|
| @pytest.mark.slow |
| @pytest.mark.parametrize( |
| "color", |
| [("#556270", "#4ECDC4", "#C7F464"), ["dodgerblue", "aquamarine", "seagreen"]], |
| ) |
| def test_parallel_coordinates_colors(self, iris, color): |
| from pandas.plotting import parallel_coordinates |
|
|
| df = iris |
|
|
| ax = _check_plot_works( |
| parallel_coordinates, frame=df, class_column="Name", color=color |
| ) |
| _check_colors(ax.get_lines()[:10], linecolors=color, mapping=df["Name"][:10]) |
|
|
| @pytest.mark.slow |
| def test_parallel_coordinates_cmap(self, iris): |
| from matplotlib import cm |
|
|
| from pandas.plotting import parallel_coordinates |
|
|
| df = iris |
|
|
| ax = _check_plot_works( |
| parallel_coordinates, frame=df, class_column="Name", colormap=cm.jet |
| ) |
| cmaps = [cm.jet(n) for n in np.linspace(0, 1, df["Name"].nunique())] |
| _check_colors(ax.get_lines()[:10], linecolors=cmaps, mapping=df["Name"][:10]) |
|
|
| @pytest.mark.slow |
| def test_parallel_coordinates_line_diff(self, iris): |
| from pandas.plotting import parallel_coordinates |
|
|
| df = iris |
|
|
| ax = _check_plot_works(parallel_coordinates, frame=df, class_column="Name") |
| nlines = len(ax.get_lines()) |
| nxticks = len(ax.xaxis.get_ticklabels()) |
|
|
| ax = _check_plot_works( |
| parallel_coordinates, frame=df, class_column="Name", axvlines=False |
| ) |
| assert len(ax.get_lines()) == (nlines - nxticks) |
|
|
| @pytest.mark.slow |
| def test_parallel_coordinates_handles(self, iris): |
| from pandas.plotting import parallel_coordinates |
|
|
| df = iris |
| colors = ["b", "g", "r"] |
| df = DataFrame({"A": [1, 2, 3], "B": [1, 2, 3], "C": [1, 2, 3], "Name": colors}) |
| ax = parallel_coordinates(df, "Name", color=colors) |
| handles, _ = ax.get_legend_handles_labels() |
| _check_colors(handles, linecolors=colors) |
|
|
| |
| @pytest.mark.filterwarnings("ignore:Attempting to set:UserWarning") |
| def test_parallel_coordinates_with_sorted_labels(self): |
| """For #15908""" |
| from pandas.plotting import parallel_coordinates |
|
|
| df = DataFrame( |
| { |
| "feat": list(range(30)), |
| "class": [2 for _ in range(10)] |
| + [3 for _ in range(10)] |
| + [1 for _ in range(10)], |
| } |
| ) |
| ax = parallel_coordinates(df, "class", sort_labels=True) |
| polylines, labels = ax.get_legend_handles_labels() |
| color_label_tuples = zip( |
| [polyline.get_color() for polyline in polylines], labels |
| ) |
| ordered_color_label_tuples = sorted(color_label_tuples, key=lambda x: x[1]) |
| prev_next_tupels = zip( |
| list(ordered_color_label_tuples[0:-1]), list(ordered_color_label_tuples[1:]) |
| ) |
| for prev, nxt in prev_next_tupels: |
| |
| assert prev[1] < nxt[1] and prev[0] < nxt[0] |
|
|
| def test_radviz_no_warning(self, iris): |
| from pandas.plotting import radviz |
|
|
| df = iris |
| |
| with tm.assert_produces_warning(None): |
| _check_plot_works(radviz, frame=df, class_column="Name") |
|
|
| @pytest.mark.parametrize( |
| "color", |
| [("#556270", "#4ECDC4", "#C7F464"), ["dodgerblue", "aquamarine", "seagreen"]], |
| ) |
| def test_radviz_color(self, iris, color): |
| from pandas.plotting import radviz |
|
|
| df = iris |
| ax = _check_plot_works(radviz, frame=df, class_column="Name", color=color) |
| |
| patches = [p for p in ax.patches[:20] if p.get_label() != ""] |
| _check_colors(patches[:10], facecolors=color, mapping=df["Name"][:10]) |
|
|
| def test_radviz_color_cmap(self, iris): |
| from matplotlib import cm |
|
|
| from pandas.plotting import radviz |
|
|
| df = iris |
| ax = _check_plot_works(radviz, frame=df, class_column="Name", colormap=cm.jet) |
| cmaps = [cm.jet(n) for n in np.linspace(0, 1, df["Name"].nunique())] |
| patches = [p for p in ax.patches[:20] if p.get_label() != ""] |
| _check_colors(patches, facecolors=cmaps, mapping=df["Name"][:10]) |
|
|
| def test_radviz_colors_handles(self): |
| from pandas.plotting import radviz |
|
|
| colors = [[0.0, 0.0, 1.0, 1.0], [0.0, 0.5, 1.0, 1.0], [1.0, 0.0, 0.0, 1.0]] |
| df = DataFrame( |
| {"A": [1, 2, 3], "B": [2, 1, 3], "C": [3, 2, 1], "Name": ["b", "g", "r"]} |
| ) |
| ax = radviz(df, "Name", color=colors) |
| handles, _ = ax.get_legend_handles_labels() |
| _check_colors(handles, facecolors=colors) |
|
|
| def test_subplot_titles(self, iris): |
| df = iris.drop("Name", axis=1).head() |
| |
| title = list(df.columns) |
|
|
| |
| plot = df.plot(subplots=True, title=title) |
| assert [p.get_title() for p in plot] == title |
|
|
| def test_subplot_titles_too_much(self, iris): |
| df = iris.drop("Name", axis=1).head() |
| |
| title = list(df.columns) |
| |
| msg = ( |
| "The length of `title` must equal the number of columns if " |
| "using `title` of type `list` and `subplots=True`" |
| ) |
| with pytest.raises(ValueError, match=msg): |
| df.plot(subplots=True, title=title + ["kittens > puppies"]) |
|
|
| def test_subplot_titles_too_little(self, iris): |
| df = iris.drop("Name", axis=1).head() |
| |
| title = list(df.columns) |
| msg = ( |
| "The length of `title` must equal the number of columns if " |
| "using `title` of type `list` and `subplots=True`" |
| ) |
| |
| with pytest.raises(ValueError, match=msg): |
| df.plot(subplots=True, title=title[:2]) |
|
|
| def test_subplot_titles_subplots_false(self, iris): |
| df = iris.drop("Name", axis=1).head() |
| |
| title = list(df.columns) |
| |
| msg = ( |
| "Using `title` of type `list` is not supported unless " |
| "`subplots=True` is passed" |
| ) |
| with pytest.raises(ValueError, match=msg): |
| df.plot(subplots=False, title=title) |
|
|
| def test_subplot_titles_numeric_square_layout(self, iris): |
| df = iris.drop("Name", axis=1).head() |
| |
| title = list(df.columns) |
| |
| plot = df.drop("SepalWidth", axis=1).plot( |
| subplots=True, layout=(2, 2), title=title[:-1] |
| ) |
| title_list = [ax.get_title() for sublist in plot for ax in sublist] |
| assert title_list == title[:3] + [""] |
|
|
| def test_get_standard_colors_random_seed(self): |
| |
| df = DataFrame(np.zeros((10, 10))) |
|
|
| |
| plotting.parallel_coordinates(df, 0) |
| rand1 = np.random.default_rng(None).random() |
| plotting.parallel_coordinates(df, 0) |
| rand2 = np.random.default_rng(None).random() |
| assert rand1 != rand2 |
|
|
| def test_get_standard_colors_consistency(self): |
| |
| |
| from pandas.plotting._matplotlib.style import get_standard_colors |
|
|
| color1 = get_standard_colors(1, color_type="random") |
| color2 = get_standard_colors(1, color_type="random") |
| assert color1 == color2 |
|
|
| def test_get_standard_colors_default_num_colors(self): |
| from pandas.plotting._matplotlib.style import get_standard_colors |
|
|
| |
| color1 = get_standard_colors(1, color_type="default") |
| color2 = get_standard_colors(9, color_type="default") |
| color3 = get_standard_colors(20, color_type="default") |
| assert len(color1) == 1 |
| assert len(color2) == 9 |
| assert len(color3) == 20 |
|
|
| def test_plot_single_color(self): |
| |
| df = DataFrame( |
| { |
| "account-start": ["2017-02-03", "2017-03-03", "2017-01-01"], |
| "client": ["Alice Anders", "Bob Baker", "Charlie Chaplin"], |
| "balance": [-1432.32, 10.43, 30000.00], |
| "db-id": [1234, 2424, 251], |
| "proxy-id": [525, 1525, 2542], |
| "rank": [52, 525, 32], |
| } |
| ) |
| ax = df.client.value_counts().plot.bar() |
| colors = [rect.get_facecolor() for rect in ax.get_children()[0:3]] |
| assert all(color == colors[0] for color in colors) |
|
|
| def test_get_standard_colors_no_appending(self): |
| |
|
|
| |
| |
| from matplotlib import cm |
|
|
| from pandas.plotting._matplotlib.style import get_standard_colors |
|
|
| color_before = cm.gnuplot(range(5)) |
| color_after = get_standard_colors(1, color=color_before) |
| assert len(color_after) == len(color_before) |
|
|
| df = DataFrame( |
| np.random.default_rng(2).standard_normal((48, 4)), columns=list("ABCD") |
| ) |
|
|
| color_list = cm.gnuplot(np.linspace(0, 1, 16)) |
| p = df.A.plot.bar(figsize=(16, 7), color=color_list) |
| assert p.patches[1].get_facecolor() == p.patches[17].get_facecolor() |
|
|
| @pytest.mark.parametrize("kind", ["bar", "line"]) |
| def test_dictionary_color(self, kind): |
| |
| |
| data_files = ["a", "b"] |
|
|
| expected = [(0.5, 0.24, 0.6), (0.3, 0.7, 0.7)] |
|
|
| df1 = DataFrame(np.random.default_rng(2).random((2, 2)), columns=data_files) |
| dic_color = {"b": (0.3, 0.7, 0.7), "a": (0.5, 0.24, 0.6)} |
|
|
| ax = df1.plot(kind=kind, color=dic_color) |
| if kind == "bar": |
| colors = [rect.get_facecolor()[0:-1] for rect in ax.get_children()[0:3:2]] |
| else: |
| colors = [rect.get_color() for rect in ax.get_lines()[0:2]] |
| assert all(color == expected[index] for index, color in enumerate(colors)) |
|
|
| def test_bar_plot(self): |
| |
| |
| from matplotlib.text import Text |
|
|
| expected = [Text(0, 0, "0"), Text(1, 0, "Total")] |
|
|
| df = DataFrame( |
| { |
| "a": [1, 2], |
| }, |
| index=Index([0, "Total"]), |
| ) |
| plot_bar = df.plot.bar() |
| assert all( |
| (a.get_text() == b.get_text()) |
| for a, b in zip(plot_bar.get_xticklabels(), expected) |
| ) |
|
|
| def test_barh_plot_labels_mixed_integer_string(self): |
| |
| |
| from matplotlib.text import Text |
|
|
| df = DataFrame([{"word": 1, "value": 0}, {"word": "knowledge", "value": 2}]) |
| plot_barh = df.plot.barh(x="word", legend=None) |
| expected_yticklabels = [Text(0, 0, "1"), Text(0, 1, "knowledge")] |
| assert all( |
| actual.get_text() == expected.get_text() |
| for actual, expected in zip( |
| plot_barh.get_yticklabels(), expected_yticklabels |
| ) |
| ) |
|
|
| def test_has_externally_shared_axis_x_axis(self): |
| |
| |
| func = plotting._matplotlib.tools._has_externally_shared_axis |
|
|
| fig = mpl.pyplot.figure() |
| plots = fig.subplots(2, 4) |
|
|
| |
| plots[0][0] = fig.add_subplot(231, sharex=plots[1][0]) |
| plots[0][2] = fig.add_subplot(233, sharex=plots[1][2]) |
|
|
| |
| plots[0][1].twinx() |
| plots[0][2].twinx() |
|
|
| |
| |
| |
| |
| assert func(plots[0][0], "x") |
| assert not func(plots[0][1], "x") |
| assert func(plots[0][2], "x") |
| assert not func(plots[0][3], "x") |
|
|
| def test_has_externally_shared_axis_y_axis(self): |
| |
| |
| func = plotting._matplotlib.tools._has_externally_shared_axis |
|
|
| fig = mpl.pyplot.figure() |
| plots = fig.subplots(4, 2) |
|
|
| |
| plots[0][0] = fig.add_subplot(321, sharey=plots[0][1]) |
| plots[2][0] = fig.add_subplot(325, sharey=plots[2][1]) |
|
|
| |
| plots[1][0].twiny() |
| plots[2][0].twiny() |
|
|
| |
| |
| |
| |
| assert func(plots[0][0], "y") |
| assert not func(plots[1][0], "y") |
| assert func(plots[2][0], "y") |
| assert not func(plots[3][0], "y") |
|
|
| def test_has_externally_shared_axis_invalid_compare_axis(self): |
| |
| |
| |
| func = plotting._matplotlib.tools._has_externally_shared_axis |
|
|
| fig = mpl.pyplot.figure() |
| plots = fig.subplots(4, 2) |
|
|
| |
| plots[0][0] = fig.add_subplot(321, sharey=plots[0][1]) |
|
|
| |
| msg = "needs 'x' or 'y' as a second parameter" |
| with pytest.raises(ValueError, match=msg): |
| func(plots[0][0], "z") |
|
|
| def test_externally_shared_axes(self): |
| |
| |
| df = DataFrame( |
| { |
| "a": np.random.default_rng(2).standard_normal(1000), |
| "b": np.random.default_rng(2).standard_normal(1000), |
| } |
| ) |
|
|
| |
| fig = mpl.pyplot.figure() |
| plots = fig.subplots(2, 3) |
|
|
| |
| plots[0][0] = fig.add_subplot(231, sharex=plots[1][0]) |
| |
| plots[0][2] = fig.add_subplot(233, sharex=plots[1][2]) |
|
|
| |
| |
| twin_ax1 = plots[0][1].twinx() |
| twin_ax2 = plots[0][2].twinx() |
|
|
| |
| df["a"].plot(ax=plots[0][0], title="External share only").set_xlabel( |
| "this label should never be visible" |
| ) |
| df["a"].plot(ax=plots[1][0]) |
|
|
| df["a"].plot(ax=plots[0][1], title="Internal share (twin) only").set_xlabel( |
| "this label should always be visible" |
| ) |
| df["a"].plot(ax=plots[1][1]) |
|
|
| df["a"].plot(ax=plots[0][2], title="Both").set_xlabel( |
| "this label should never be visible" |
| ) |
| df["a"].plot(ax=plots[1][2]) |
|
|
| |
| df["b"].plot(ax=twin_ax1, color="green") |
| df["b"].plot(ax=twin_ax2, color="yellow") |
|
|
| assert not plots[0][0].xaxis.get_label().get_visible() |
| assert plots[0][1].xaxis.get_label().get_visible() |
| assert not plots[0][2].xaxis.get_label().get_visible() |
|
|
| def test_plot_bar_axis_units_timestamp_conversion(self): |
| |
| |
| |
| df = DataFrame( |
| [1.0], |
| index=[Timestamp("2022-02-22 22:22:22")], |
| ) |
| _check_plot_works(df.plot) |
| s = Series({"A": 1.0}) |
| _check_plot_works(s.plot.bar) |
|
|
| def test_bar_plt_xaxis_intervalrange(self): |
| |
| |
| from matplotlib.text import Text |
|
|
| expected = [Text(0, 0, "([0, 1],)"), Text(1, 0, "([1, 2],)")] |
| s = Series( |
| [1, 2], |
| index=[interval_range(0, 2, closed="both")], |
| ) |
| _check_plot_works(s.plot.bar) |
| assert all( |
| (a.get_text() == b.get_text()) |
| for a, b in zip(s.plot.bar().get_xticklabels(), expected) |
| ) |
|
|