1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474 |
- import warnings
- import numpy as np
- import pandas as pd
- from scipy import stats
- import matplotlib as mpl
- import matplotlib.pyplot as plt
- import pytest
- import nose.tools as nt
- import numpy.testing as npt
- try:
- import pandas.testing as tm
- except ImportError:
- import pandas.util.testing as tm
- from .. import axisgrid as ag
- from .. import rcmod
- from ..palettes import color_palette
- from ..distributions import kdeplot, _freedman_diaconis_bins
- from ..categorical import pointplot
- from ..utils import categorical_order
- rs = np.random.RandomState(0)
- class TestFacetGrid(object):
- df = pd.DataFrame(dict(x=rs.normal(size=60),
- y=rs.gamma(4, size=60),
- a=np.repeat(list("abc"), 20),
- b=np.tile(list("mn"), 30),
- c=np.tile(list("tuv"), 20),
- d=np.tile(list("abcdefghijkl"), 5)))
- def test_self_data(self):
- g = ag.FacetGrid(self.df)
- nt.assert_is(g.data, self.df)
- def test_self_fig(self):
- g = ag.FacetGrid(self.df)
- nt.assert_is_instance(g.fig, plt.Figure)
- def test_self_axes(self):
- g = ag.FacetGrid(self.df, row="a", col="b", hue="c")
- for ax in g.axes.flat:
- nt.assert_is_instance(ax, plt.Axes)
- def test_axes_array_size(self):
- g1 = ag.FacetGrid(self.df)
- nt.assert_equal(g1.axes.shape, (1, 1))
- g2 = ag.FacetGrid(self.df, row="a")
- nt.assert_equal(g2.axes.shape, (3, 1))
- g3 = ag.FacetGrid(self.df, col="b")
- nt.assert_equal(g3.axes.shape, (1, 2))
- g4 = ag.FacetGrid(self.df, hue="c")
- nt.assert_equal(g4.axes.shape, (1, 1))
- g5 = ag.FacetGrid(self.df, row="a", col="b", hue="c")
- nt.assert_equal(g5.axes.shape, (3, 2))
- for ax in g5.axes.flat:
- nt.assert_is_instance(ax, plt.Axes)
- def test_single_axes(self):
- g1 = ag.FacetGrid(self.df)
- nt.assert_is_instance(g1.ax, plt.Axes)
- g2 = ag.FacetGrid(self.df, row="a")
- with nt.assert_raises(AttributeError):
- g2.ax
- g3 = ag.FacetGrid(self.df, col="a")
- with nt.assert_raises(AttributeError):
- g3.ax
- g4 = ag.FacetGrid(self.df, col="a", row="b")
- with nt.assert_raises(AttributeError):
- g4.ax
- def test_col_wrap(self):
- n = len(self.df.d.unique())
- g = ag.FacetGrid(self.df, col="d")
- assert g.axes.shape == (1, n)
- assert g.facet_axis(0, 8) is g.axes[0, 8]
- g_wrap = ag.FacetGrid(self.df, col="d", col_wrap=4)
- assert g_wrap.axes.shape == (n,)
- assert g_wrap.facet_axis(0, 8) is g_wrap.axes[8]
- assert g_wrap._ncol == 4
- assert g_wrap._nrow == (n / 4)
- with pytest.raises(ValueError):
- g = ag.FacetGrid(self.df, row="b", col="d", col_wrap=4)
- df = self.df.copy()
- df.loc[df.d == "j"] = np.nan
- g_missing = ag.FacetGrid(df, col="d")
- assert g_missing.axes.shape == (1, n - 1)
- g_missing_wrap = ag.FacetGrid(df, col="d", col_wrap=4)
- assert g_missing_wrap.axes.shape == (n - 1,)
- g = ag.FacetGrid(self.df, col="d", col_wrap=1)
- assert len(list(g.facet_data())) == n
- def test_normal_axes(self):
- null = np.empty(0, object).flat
- g = ag.FacetGrid(self.df)
- npt.assert_array_equal(g._bottom_axes, g.axes.flat)
- npt.assert_array_equal(g._not_bottom_axes, null)
- npt.assert_array_equal(g._left_axes, g.axes.flat)
- npt.assert_array_equal(g._not_left_axes, null)
- npt.assert_array_equal(g._inner_axes, null)
- g = ag.FacetGrid(self.df, col="c")
- npt.assert_array_equal(g._bottom_axes, g.axes.flat)
- npt.assert_array_equal(g._not_bottom_axes, null)
- npt.assert_array_equal(g._left_axes, g.axes[:, 0].flat)
- npt.assert_array_equal(g._not_left_axes, g.axes[:, 1:].flat)
- npt.assert_array_equal(g._inner_axes, null)
- g = ag.FacetGrid(self.df, row="c")
- npt.assert_array_equal(g._bottom_axes, g.axes[-1, :].flat)
- npt.assert_array_equal(g._not_bottom_axes, g.axes[:-1, :].flat)
- npt.assert_array_equal(g._left_axes, g.axes.flat)
- npt.assert_array_equal(g._not_left_axes, null)
- npt.assert_array_equal(g._inner_axes, null)
- g = ag.FacetGrid(self.df, col="a", row="c")
- npt.assert_array_equal(g._bottom_axes, g.axes[-1, :].flat)
- npt.assert_array_equal(g._not_bottom_axes, g.axes[:-1, :].flat)
- npt.assert_array_equal(g._left_axes, g.axes[:, 0].flat)
- npt.assert_array_equal(g._not_left_axes, g.axes[:, 1:].flat)
- npt.assert_array_equal(g._inner_axes, g.axes[:-1, 1:].flat)
- def test_wrapped_axes(self):
- null = np.empty(0, object).flat
- g = ag.FacetGrid(self.df, col="a", col_wrap=2)
- npt.assert_array_equal(g._bottom_axes,
- g.axes[np.array([1, 2])].flat)
- npt.assert_array_equal(g._not_bottom_axes, g.axes[:1].flat)
- npt.assert_array_equal(g._left_axes, g.axes[np.array([0, 2])].flat)
- npt.assert_array_equal(g._not_left_axes, g.axes[np.array([1])].flat)
- npt.assert_array_equal(g._inner_axes, null)
- def test_figure_size(self):
- g = ag.FacetGrid(self.df, row="a", col="b")
- npt.assert_array_equal(g.fig.get_size_inches(), (6, 9))
- g = ag.FacetGrid(self.df, row="a", col="b", height=6)
- npt.assert_array_equal(g.fig.get_size_inches(), (12, 18))
- g = ag.FacetGrid(self.df, col="c", height=4, aspect=.5)
- npt.assert_array_equal(g.fig.get_size_inches(), (6, 4))
- def test_figure_size_with_legend(self):
- g1 = ag.FacetGrid(self.df, col="a", hue="c", height=4, aspect=.5)
- npt.assert_array_equal(g1.fig.get_size_inches(), (6, 4))
- g1.add_legend()
- nt.assert_greater(g1.fig.get_size_inches()[0], 6)
- g2 = ag.FacetGrid(self.df, col="a", hue="c", height=4, aspect=.5,
- legend_out=False)
- npt.assert_array_equal(g2.fig.get_size_inches(), (6, 4))
- g2.add_legend()
- npt.assert_array_equal(g2.fig.get_size_inches(), (6, 4))
- def test_legend_data(self):
- g1 = ag.FacetGrid(self.df, hue="a")
- g1.map(plt.plot, "x", "y")
- g1.add_legend()
- palette = color_palette(n_colors=3)
- nt.assert_equal(g1._legend.get_title().get_text(), "a")
- a_levels = sorted(self.df.a.unique())
- lines = g1._legend.get_lines()
- nt.assert_equal(len(lines), len(a_levels))
- for line, hue in zip(lines, palette):
- nt.assert_equal(line.get_color(), hue)
- labels = g1._legend.get_texts()
- nt.assert_equal(len(labels), len(a_levels))
- for label, level in zip(labels, a_levels):
- nt.assert_equal(label.get_text(), level)
- def test_legend_data_missing_level(self):
- g1 = ag.FacetGrid(self.df, hue="a", hue_order=list("azbc"))
- g1.map(plt.plot, "x", "y")
- g1.add_legend()
- b, g, r, p = color_palette(n_colors=4)
- palette = [b, r, p]
- nt.assert_equal(g1._legend.get_title().get_text(), "a")
- a_levels = sorted(self.df.a.unique())
- lines = g1._legend.get_lines()
- nt.assert_equal(len(lines), len(a_levels))
- for line, hue in zip(lines, palette):
- nt.assert_equal(line.get_color(), hue)
- labels = g1._legend.get_texts()
- nt.assert_equal(len(labels), 4)
- for label, level in zip(labels, list("azbc")):
- nt.assert_equal(label.get_text(), level)
- def test_get_boolean_legend_data(self):
- self.df["b_bool"] = self.df.b == "m"
- g1 = ag.FacetGrid(self.df, hue="b_bool")
- g1.map(plt.plot, "x", "y")
- g1.add_legend()
- palette = color_palette(n_colors=2)
- nt.assert_equal(g1._legend.get_title().get_text(), "b_bool")
- b_levels = list(map(str, categorical_order(self.df.b_bool)))
- lines = g1._legend.get_lines()
- nt.assert_equal(len(lines), len(b_levels))
- for line, hue in zip(lines, palette):
- nt.assert_equal(line.get_color(), hue)
- labels = g1._legend.get_texts()
- nt.assert_equal(len(labels), len(b_levels))
- for label, level in zip(labels, b_levels):
- nt.assert_equal(label.get_text(), level)
- def test_legend_tuples(self):
- g = ag.FacetGrid(self.df, hue="a")
- g.map(plt.plot, "x", "y")
- handles, labels = g.ax.get_legend_handles_labels()
- label_tuples = [("", l) for l in labels]
- legend_data = dict(zip(label_tuples, handles))
- g.add_legend(legend_data, label_tuples)
- for entry, label in zip(g._legend.get_texts(), labels):
- assert entry.get_text() == label
- def test_legend_options(self):
- g1 = ag.FacetGrid(self.df, hue="b")
- g1.map(plt.plot, "x", "y")
- g1.add_legend()
- def test_legendout_with_colwrap(self):
- g = ag.FacetGrid(self.df, col="d", hue='b',
- col_wrap=4, legend_out=False)
- g.map(plt.plot, "x", "y", linewidth=3)
- g.add_legend()
- def test_subplot_kws(self):
- g = ag.FacetGrid(self.df, despine=False,
- subplot_kws=dict(projection="polar"))
- for ax in g.axes.flat:
- nt.assert_true("PolarAxesSubplot" in str(type(ax)))
- def test_gridspec_kws(self):
- ratios = [3, 1, 2]
- gskws = dict(width_ratios=ratios)
- g = ag.FacetGrid(self.df, col='c', row='a', gridspec_kws=gskws)
- for ax in g.axes.flat:
- ax.set_xticks([])
- ax.set_yticks([])
- g.fig.tight_layout()
- for (l, m, r) in g.axes:
- assert l.get_position().width > m.get_position().width
- assert r.get_position().width > m.get_position().width
- def test_gridspec_kws_col_wrap(self):
- ratios = [3, 1, 2, 1, 1]
- gskws = dict(width_ratios=ratios)
- with warnings.catch_warnings():
- warnings.resetwarnings()
- warnings.simplefilter("always")
- npt.assert_warns(UserWarning, ag.FacetGrid, self.df, col='d',
- col_wrap=5, gridspec_kws=gskws)
- def test_data_generator(self):
- g = ag.FacetGrid(self.df, row="a")
- d = list(g.facet_data())
- nt.assert_equal(len(d), 3)
- tup, data = d[0]
- nt.assert_equal(tup, (0, 0, 0))
- nt.assert_true((data["a"] == "a").all())
- tup, data = d[1]
- nt.assert_equal(tup, (1, 0, 0))
- nt.assert_true((data["a"] == "b").all())
- g = ag.FacetGrid(self.df, row="a", col="b")
- d = list(g.facet_data())
- nt.assert_equal(len(d), 6)
- tup, data = d[0]
- nt.assert_equal(tup, (0, 0, 0))
- nt.assert_true((data["a"] == "a").all())
- nt.assert_true((data["b"] == "m").all())
- tup, data = d[1]
- nt.assert_equal(tup, (0, 1, 0))
- nt.assert_true((data["a"] == "a").all())
- nt.assert_true((data["b"] == "n").all())
- tup, data = d[2]
- nt.assert_equal(tup, (1, 0, 0))
- nt.assert_true((data["a"] == "b").all())
- nt.assert_true((data["b"] == "m").all())
- g = ag.FacetGrid(self.df, hue="c")
- d = list(g.facet_data())
- nt.assert_equal(len(d), 3)
- tup, data = d[1]
- nt.assert_equal(tup, (0, 0, 1))
- nt.assert_true((data["c"] == "u").all())
- def test_map(self):
- g = ag.FacetGrid(self.df, row="a", col="b", hue="c")
- g.map(plt.plot, "x", "y", linewidth=3)
- lines = g.axes[0, 0].lines
- nt.assert_equal(len(lines), 3)
- line1, _, _ = lines
- nt.assert_equal(line1.get_linewidth(), 3)
- x, y = line1.get_data()
- mask = (self.df.a == "a") & (self.df.b == "m") & (self.df.c == "t")
- npt.assert_array_equal(x, self.df.x[mask])
- npt.assert_array_equal(y, self.df.y[mask])
- def test_map_dataframe(self):
- g = ag.FacetGrid(self.df, row="a", col="b", hue="c")
- def plot(x, y, data=None, **kws):
- plt.plot(data[x], data[y], **kws)
- g.map_dataframe(plot, "x", "y", linestyle="--")
- lines = g.axes[0, 0].lines
- nt.assert_equal(len(lines), 3)
- line1, _, _ = lines
- nt.assert_equal(line1.get_linestyle(), "--")
- x, y = line1.get_data()
- mask = (self.df.a == "a") & (self.df.b == "m") & (self.df.c == "t")
- npt.assert_array_equal(x, self.df.x[mask])
- npt.assert_array_equal(y, self.df.y[mask])
- def test_set(self):
- g = ag.FacetGrid(self.df, row="a", col="b")
- xlim = (-2, 5)
- ylim = (3, 6)
- xticks = [-2, 0, 3, 5]
- yticks = [3, 4.5, 6]
- g.set(xlim=xlim, ylim=ylim, xticks=xticks, yticks=yticks)
- for ax in g.axes.flat:
- npt.assert_array_equal(ax.get_xlim(), xlim)
- npt.assert_array_equal(ax.get_ylim(), ylim)
- npt.assert_array_equal(ax.get_xticks(), xticks)
- npt.assert_array_equal(ax.get_yticks(), yticks)
- def test_set_titles(self):
- g = ag.FacetGrid(self.df, row="a", col="b")
- g.map(plt.plot, "x", "y")
- # Test the default titles
- nt.assert_equal(g.axes[0, 0].get_title(), "a = a | b = m")
- nt.assert_equal(g.axes[0, 1].get_title(), "a = a | b = n")
- nt.assert_equal(g.axes[1, 0].get_title(), "a = b | b = m")
- # Test a provided title
- g.set_titles("{row_var} == {row_name} \\/ {col_var} == {col_name}")
- nt.assert_equal(g.axes[0, 0].get_title(), "a == a \\/ b == m")
- nt.assert_equal(g.axes[0, 1].get_title(), "a == a \\/ b == n")
- nt.assert_equal(g.axes[1, 0].get_title(), "a == b \\/ b == m")
- # Test a single row
- g = ag.FacetGrid(self.df, col="b")
- g.map(plt.plot, "x", "y")
- # Test the default titles
- nt.assert_equal(g.axes[0, 0].get_title(), "b = m")
- nt.assert_equal(g.axes[0, 1].get_title(), "b = n")
- # test with dropna=False
- g = ag.FacetGrid(self.df, col="b", hue="b", dropna=False)
- g.map(plt.plot, 'x', 'y')
- def test_set_titles_margin_titles(self):
- g = ag.FacetGrid(self.df, row="a", col="b", margin_titles=True)
- g.map(plt.plot, "x", "y")
- # Test the default titles
- nt.assert_equal(g.axes[0, 0].get_title(), "b = m")
- nt.assert_equal(g.axes[0, 1].get_title(), "b = n")
- nt.assert_equal(g.axes[1, 0].get_title(), "")
- # Test the row "titles"
- nt.assert_equal(g.axes[0, 1].texts[0].get_text(), "a = a")
- nt.assert_equal(g.axes[1, 1].texts[0].get_text(), "a = b")
- # Test a provided title
- g.set_titles(col_template="{col_var} == {col_name}")
- nt.assert_equal(g.axes[0, 0].get_title(), "b == m")
- nt.assert_equal(g.axes[0, 1].get_title(), "b == n")
- nt.assert_equal(g.axes[1, 0].get_title(), "")
- def test_set_ticklabels(self):
- g = ag.FacetGrid(self.df, row="a", col="b")
- g.map(plt.plot, "x", "y")
- xlab = [l.get_text() + "h" for l in g.axes[1, 0].get_xticklabels()]
- ylab = [l.get_text() for l in g.axes[1, 0].get_yticklabels()]
- g.set_xticklabels(xlab)
- g.set_yticklabels(ylab)
- got_x = [l.get_text() for l in g.axes[1, 1].get_xticklabels()]
- got_y = [l.get_text() for l in g.axes[0, 0].get_yticklabels()]
- npt.assert_array_equal(got_x, xlab)
- npt.assert_array_equal(got_y, ylab)
- x, y = np.arange(10), np.arange(10)
- df = pd.DataFrame(np.c_[x, y], columns=["x", "y"])
- g = ag.FacetGrid(df).map(pointplot, "x", "y", order=x)
- g.set_xticklabels(step=2)
- got_x = [int(l.get_text()) for l in g.axes[0, 0].get_xticklabels()]
- npt.assert_array_equal(x[::2], got_x)
- g = ag.FacetGrid(self.df, col="d", col_wrap=5)
- g.map(plt.plot, "x", "y")
- g.set_xticklabels(rotation=45)
- g.set_yticklabels(rotation=75)
- for ax in g._bottom_axes:
- for l in ax.get_xticklabels():
- nt.assert_equal(l.get_rotation(), 45)
- for ax in g._left_axes:
- for l in ax.get_yticklabels():
- nt.assert_equal(l.get_rotation(), 75)
- def test_set_axis_labels(self):
- g = ag.FacetGrid(self.df, row="a", col="b")
- g.map(plt.plot, "x", "y")
- xlab = 'xx'
- ylab = 'yy'
- g.set_axis_labels(xlab, ylab)
- got_x = [ax.get_xlabel() for ax in g.axes[-1, :]]
- got_y = [ax.get_ylabel() for ax in g.axes[:, 0]]
- npt.assert_array_equal(got_x, xlab)
- npt.assert_array_equal(got_y, ylab)
- def test_axis_lims(self):
- g = ag.FacetGrid(self.df, row="a", col="b", xlim=(0, 4), ylim=(-2, 3))
- nt.assert_equal(g.axes[0, 0].get_xlim(), (0, 4))
- nt.assert_equal(g.axes[0, 0].get_ylim(), (-2, 3))
- def test_data_orders(self):
- g = ag.FacetGrid(self.df, row="a", col="b", hue="c")
- nt.assert_equal(g.row_names, list("abc"))
- nt.assert_equal(g.col_names, list("mn"))
- nt.assert_equal(g.hue_names, list("tuv"))
- nt.assert_equal(g.axes.shape, (3, 2))
- g = ag.FacetGrid(self.df, row="a", col="b", hue="c",
- row_order=list("bca"),
- col_order=list("nm"),
- hue_order=list("vtu"))
- nt.assert_equal(g.row_names, list("bca"))
- nt.assert_equal(g.col_names, list("nm"))
- nt.assert_equal(g.hue_names, list("vtu"))
- nt.assert_equal(g.axes.shape, (3, 2))
- g = ag.FacetGrid(self.df, row="a", col="b", hue="c",
- row_order=list("bcda"),
- col_order=list("nom"),
- hue_order=list("qvtu"))
- nt.assert_equal(g.row_names, list("bcda"))
- nt.assert_equal(g.col_names, list("nom"))
- nt.assert_equal(g.hue_names, list("qvtu"))
- nt.assert_equal(g.axes.shape, (4, 3))
- def test_palette(self):
- rcmod.set()
- g = ag.FacetGrid(self.df, hue="c")
- assert g._colors == color_palette(n_colors=len(self.df.c.unique()))
- g = ag.FacetGrid(self.df, hue="d")
- assert g._colors == color_palette("husl", len(self.df.d.unique()))
- g = ag.FacetGrid(self.df, hue="c", palette="Set2")
- assert g._colors == color_palette("Set2", len(self.df.c.unique()))
- dict_pal = dict(t="red", u="green", v="blue")
- list_pal = color_palette(["red", "green", "blue"], 3)
- g = ag.FacetGrid(self.df, hue="c", palette=dict_pal)
- assert g._colors == list_pal
- list_pal = color_palette(["green", "blue", "red"], 3)
- g = ag.FacetGrid(self.df, hue="c", hue_order=list("uvt"),
- palette=dict_pal)
- assert g._colors == list_pal
- def test_hue_kws(self):
- kws = dict(marker=["o", "s", "D"])
- g = ag.FacetGrid(self.df, hue="c", hue_kws=kws)
- g.map(plt.plot, "x", "y")
- for line, marker in zip(g.axes[0, 0].lines, kws["marker"]):
- nt.assert_equal(line.get_marker(), marker)
- def test_dropna(self):
- df = self.df.copy()
- hasna = pd.Series(np.tile(np.arange(6), 10), dtype=np.float)
- hasna[hasna == 5] = np.nan
- df["hasna"] = hasna
- g = ag.FacetGrid(df, dropna=False, row="hasna")
- nt.assert_equal(g._not_na.sum(), 60)
- g = ag.FacetGrid(df, dropna=True, row="hasna")
- nt.assert_equal(g._not_na.sum(), 50)
- def test_categorical_column_missing_categories(self):
- df = self.df.copy()
- df['a'] = df['a'].astype('category')
- g = ag.FacetGrid(df[df['a'] == 'a'], col="a", col_wrap=1)
- nt.assert_equal(g.axes.shape, (len(df['a'].cat.categories),))
- def test_categorical_warning(self):
- g = ag.FacetGrid(self.df, col="b")
- with warnings.catch_warnings():
- warnings.resetwarnings()
- warnings.simplefilter("always")
- npt.assert_warns(UserWarning, g.map, pointplot, "b", "x")
- class TestPairGrid(object):
- rs = np.random.RandomState(sum(map(ord, "PairGrid")))
- df = pd.DataFrame(dict(x=rs.normal(size=60),
- y=rs.randint(0, 4, size=(60)),
- z=rs.gamma(3, size=60),
- a=np.repeat(list("abc"), 20),
- b=np.repeat(list("abcdefghijkl"), 5)))
- def test_self_data(self):
- g = ag.PairGrid(self.df)
- nt.assert_is(g.data, self.df)
- def test_ignore_datelike_data(self):
- df = self.df.copy()
- df['date'] = pd.date_range('2010-01-01', periods=len(df), freq='d')
- result = ag.PairGrid(self.df).data
- expected = df.drop('date', axis=1)
- tm.assert_frame_equal(result, expected)
- def test_self_fig(self):
- g = ag.PairGrid(self.df)
- nt.assert_is_instance(g.fig, plt.Figure)
- def test_self_axes(self):
- g = ag.PairGrid(self.df)
- for ax in g.axes.flat:
- nt.assert_is_instance(ax, plt.Axes)
- def test_default_axes(self):
- g = ag.PairGrid(self.df)
- nt.assert_equal(g.axes.shape, (3, 3))
- nt.assert_equal(g.x_vars, ["x", "y", "z"])
- nt.assert_equal(g.y_vars, ["x", "y", "z"])
- nt.assert_true(g.square_grid)
- def test_specific_square_axes(self):
- vars = ["z", "x"]
- g = ag.PairGrid(self.df, vars=vars)
- nt.assert_equal(g.axes.shape, (len(vars), len(vars)))
- nt.assert_equal(g.x_vars, vars)
- nt.assert_equal(g.y_vars, vars)
- nt.assert_true(g.square_grid)
- def test_remove_hue_from_default(self):
- hue = "z"
- g = ag.PairGrid(self.df, hue=hue)
- assert hue not in g.x_vars
- assert hue not in g.y_vars
- vars = ["x", "y", "z"]
- g = ag.PairGrid(self.df, hue=hue, vars=vars)
- assert hue in g.x_vars
- assert hue in g.y_vars
- def test_specific_nonsquare_axes(self):
- x_vars = ["x", "y"]
- y_vars = ["z", "y", "x"]
- g = ag.PairGrid(self.df, x_vars=x_vars, y_vars=y_vars)
- nt.assert_equal(g.axes.shape, (len(y_vars), len(x_vars)))
- nt.assert_equal(g.x_vars, x_vars)
- nt.assert_equal(g.y_vars, y_vars)
- nt.assert_true(not g.square_grid)
- x_vars = ["x", "y"]
- y_vars = "z"
- g = ag.PairGrid(self.df, x_vars=x_vars, y_vars=y_vars)
- nt.assert_equal(g.axes.shape, (len(y_vars), len(x_vars)))
- nt.assert_equal(g.x_vars, list(x_vars))
- nt.assert_equal(g.y_vars, list(y_vars))
- nt.assert_true(not g.square_grid)
- def test_specific_square_axes_with_array(self):
- vars = np.array(["z", "x"])
- g = ag.PairGrid(self.df, vars=vars)
- nt.assert_equal(g.axes.shape, (len(vars), len(vars)))
- nt.assert_equal(g.x_vars, list(vars))
- nt.assert_equal(g.y_vars, list(vars))
- nt.assert_true(g.square_grid)
- def test_specific_nonsquare_axes_with_array(self):
- x_vars = np.array(["x", "y"])
- y_vars = np.array(["z", "y", "x"])
- g = ag.PairGrid(self.df, x_vars=x_vars, y_vars=y_vars)
- nt.assert_equal(g.axes.shape, (len(y_vars), len(x_vars)))
- nt.assert_equal(g.x_vars, list(x_vars))
- nt.assert_equal(g.y_vars, list(y_vars))
- nt.assert_true(not g.square_grid)
- def test_corner(self):
- plot_vars = ["x", "y", "z"]
- g1 = ag.PairGrid(self.df, vars=plot_vars, corner=True)
- corner_size = sum([i + 1 for i in range(len(plot_vars))])
- assert len(g1.fig.axes) == corner_size
- g1.map_diag(plt.hist)
- assert len(g1.fig.axes) == (corner_size + len(plot_vars))
- for ax in np.diag(g1.axes):
- assert not ax.yaxis.get_visible()
- assert not g1.axes[0, 0].get_ylabel()
- def test_size(self):
- g1 = ag.PairGrid(self.df, height=3)
- npt.assert_array_equal(g1.fig.get_size_inches(), (9, 9))
- g2 = ag.PairGrid(self.df, height=4, aspect=.5)
- npt.assert_array_equal(g2.fig.get_size_inches(), (6, 12))
- g3 = ag.PairGrid(self.df, y_vars=["z"], x_vars=["x", "y"],
- height=2, aspect=2)
- npt.assert_array_equal(g3.fig.get_size_inches(), (8, 2))
- def test_map(self):
- vars = ["x", "y", "z"]
- g1 = ag.PairGrid(self.df)
- g1.map(plt.scatter)
- for i, axes_i in enumerate(g1.axes):
- for j, ax in enumerate(axes_i):
- x_in = self.df[vars[j]]
- y_in = self.df[vars[i]]
- x_out, y_out = ax.collections[0].get_offsets().T
- npt.assert_array_equal(x_in, x_out)
- npt.assert_array_equal(y_in, y_out)
- g2 = ag.PairGrid(self.df, "a")
- g2.map(plt.scatter)
- for i, axes_i in enumerate(g2.axes):
- for j, ax in enumerate(axes_i):
- x_in = self.df[vars[j]]
- y_in = self.df[vars[i]]
- for k, k_level in enumerate(self.df.a.unique()):
- x_in_k = x_in[self.df.a == k_level]
- y_in_k = y_in[self.df.a == k_level]
- x_out, y_out = ax.collections[k].get_offsets().T
- npt.assert_array_equal(x_in_k, x_out)
- npt.assert_array_equal(y_in_k, y_out)
- def test_map_nonsquare(self):
- x_vars = ["x"]
- y_vars = ["y", "z"]
- g = ag.PairGrid(self.df, x_vars=x_vars, y_vars=y_vars)
- g.map(plt.scatter)
- x_in = self.df.x
- for i, i_var in enumerate(y_vars):
- ax = g.axes[i, 0]
- y_in = self.df[i_var]
- x_out, y_out = ax.collections[0].get_offsets().T
- npt.assert_array_equal(x_in, x_out)
- npt.assert_array_equal(y_in, y_out)
- def test_map_lower(self):
- vars = ["x", "y", "z"]
- g = ag.PairGrid(self.df)
- g.map_lower(plt.scatter)
- for i, j in zip(*np.tril_indices_from(g.axes, -1)):
- ax = g.axes[i, j]
- x_in = self.df[vars[j]]
- y_in = self.df[vars[i]]
- x_out, y_out = ax.collections[0].get_offsets().T
- npt.assert_array_equal(x_in, x_out)
- npt.assert_array_equal(y_in, y_out)
- for i, j in zip(*np.triu_indices_from(g.axes)):
- ax = g.axes[i, j]
- nt.assert_equal(len(ax.collections), 0)
- def test_map_upper(self):
- vars = ["x", "y", "z"]
- g = ag.PairGrid(self.df)
- g.map_upper(plt.scatter)
- for i, j in zip(*np.triu_indices_from(g.axes, 1)):
- ax = g.axes[i, j]
- x_in = self.df[vars[j]]
- y_in = self.df[vars[i]]
- x_out, y_out = ax.collections[0].get_offsets().T
- npt.assert_array_equal(x_in, x_out)
- npt.assert_array_equal(y_in, y_out)
- for i, j in zip(*np.tril_indices_from(g.axes)):
- ax = g.axes[i, j]
- nt.assert_equal(len(ax.collections), 0)
- def test_map_diag(self):
- g1 = ag.PairGrid(self.df)
- g1.map_diag(plt.hist)
- for var, ax in zip(g1.diag_vars, g1.diag_axes):
- nt.assert_equal(len(ax.patches), 10)
- assert pytest.approx(ax.patches[0].get_x()) == self.df[var].min()
- g2 = ag.PairGrid(self.df, hue="a")
- g2.map_diag(plt.hist)
- for ax in g2.diag_axes:
- nt.assert_equal(len(ax.patches), 30)
- g3 = ag.PairGrid(self.df, hue="a")
- g3.map_diag(plt.hist, histtype='step')
- for ax in g3.diag_axes:
- for ptch in ax.patches:
- nt.assert_equal(ptch.fill, False)
- def test_map_diag_rectangular(self):
- x_vars = ["x", "y"]
- y_vars = ["x", "y", "z"]
- g1 = ag.PairGrid(self.df, x_vars=x_vars, y_vars=y_vars)
- g1.map_diag(plt.hist)
- assert set(g1.diag_vars) == (set(x_vars) & set(y_vars))
- for var, ax in zip(g1.diag_vars, g1.diag_axes):
- nt.assert_equal(len(ax.patches), 10)
- assert pytest.approx(ax.patches[0].get_x()) == self.df[var].min()
- for i, ax in enumerate(np.diag(g1.axes)):
- assert ax.bbox.bounds == g1.diag_axes[i].bbox.bounds
- g2 = ag.PairGrid(self.df, x_vars=x_vars, y_vars=y_vars, hue="a")
- g2.map_diag(plt.hist)
- assert set(g2.diag_vars) == (set(x_vars) & set(y_vars))
- for ax in g2.diag_axes:
- nt.assert_equal(len(ax.patches), 30)
- x_vars = ["x", "y", "z"]
- y_vars = ["x", "y"]
- g3 = ag.PairGrid(self.df, x_vars=x_vars, y_vars=y_vars)
- g3.map_diag(plt.hist)
- assert set(g3.diag_vars) == (set(x_vars) & set(y_vars))
- for var, ax in zip(g3.diag_vars, g3.diag_axes):
- nt.assert_equal(len(ax.patches), 10)
- assert pytest.approx(ax.patches[0].get_x()) == self.df[var].min()
- for i, ax in enumerate(np.diag(g3.axes)):
- assert ax.bbox.bounds == g3.diag_axes[i].bbox.bounds
- def test_map_diag_color(self):
- color = "red"
- rgb_color = mpl.colors.colorConverter.to_rgba(color)
- g1 = ag.PairGrid(self.df)
- g1.map_diag(plt.hist, color=color)
- for ax in g1.diag_axes:
- for patch in ax.patches:
- assert patch.get_facecolor() == rgb_color
- g2 = ag.PairGrid(self.df)
- g2.map_diag(kdeplot, color='red')
- for ax in g2.diag_axes:
- for line in ax.lines:
- assert line.get_color() == color
- def test_map_diag_palette(self):
- pal = color_palette(n_colors=len(self.df.a.unique()))
- g = ag.PairGrid(self.df, hue="a")
- g.map_diag(kdeplot)
- for ax in g.diag_axes:
- for line, color in zip(ax.lines, pal):
- assert line.get_color() == color
- def test_map_diag_and_offdiag(self):
- vars = ["x", "y", "z"]
- g = ag.PairGrid(self.df)
- g.map_offdiag(plt.scatter)
- g.map_diag(plt.hist)
- for ax in g.diag_axes:
- nt.assert_equal(len(ax.patches), 10)
- for i, j in zip(*np.triu_indices_from(g.axes, 1)):
- ax = g.axes[i, j]
- x_in = self.df[vars[j]]
- y_in = self.df[vars[i]]
- x_out, y_out = ax.collections[0].get_offsets().T
- npt.assert_array_equal(x_in, x_out)
- npt.assert_array_equal(y_in, y_out)
- for i, j in zip(*np.tril_indices_from(g.axes, -1)):
- ax = g.axes[i, j]
- x_in = self.df[vars[j]]
- y_in = self.df[vars[i]]
- x_out, y_out = ax.collections[0].get_offsets().T
- npt.assert_array_equal(x_in, x_out)
- npt.assert_array_equal(y_in, y_out)
- for i, j in zip(*np.diag_indices_from(g.axes)):
- ax = g.axes[i, j]
- nt.assert_equal(len(ax.collections), 0)
- def test_diag_sharey(self):
- g = ag.PairGrid(self.df, diag_sharey=True)
- g.map_diag(kdeplot)
- for ax in g.diag_axes[1:]:
- assert ax.get_ylim() == g.diag_axes[0].get_ylim()
- def test_palette(self):
- rcmod.set()
- g = ag.PairGrid(self.df, hue="a")
- assert g.palette == color_palette(n_colors=len(self.df.a.unique()))
- g = ag.PairGrid(self.df, hue="b")
- assert g.palette == color_palette("husl", len(self.df.b.unique()))
- g = ag.PairGrid(self.df, hue="a", palette="Set2")
- assert g.palette == color_palette("Set2", len(self.df.a.unique()))
- dict_pal = dict(a="red", b="green", c="blue")
- list_pal = color_palette(["red", "green", "blue"])
- g = ag.PairGrid(self.df, hue="a", palette=dict_pal)
- assert g.palette == list_pal
- list_pal = color_palette(["blue", "red", "green"])
- g = ag.PairGrid(self.df, hue="a", hue_order=list("cab"),
- palette=dict_pal)
- assert g.palette == list_pal
- def test_hue_kws(self):
- kws = dict(marker=["o", "s", "d", "+"])
- g = ag.PairGrid(self.df, hue="a", hue_kws=kws)
- g.map(plt.plot)
- for line, marker in zip(g.axes[0, 0].lines, kws["marker"]):
- nt.assert_equal(line.get_marker(), marker)
- g = ag.PairGrid(self.df, hue="a", hue_kws=kws,
- hue_order=list("dcab"))
- g.map(plt.plot)
- for line, marker in zip(g.axes[0, 0].lines, kws["marker"]):
- nt.assert_equal(line.get_marker(), marker)
- def test_hue_order(self):
- order = list("dcab")
- g = ag.PairGrid(self.df, hue="a", hue_order=order)
- g.map(plt.plot)
- for line, level in zip(g.axes[1, 0].lines, order):
- x, y = line.get_xydata().T
- npt.assert_array_equal(x, self.df.loc[self.df.a == level, "x"])
- npt.assert_array_equal(y, self.df.loc[self.df.a == level, "y"])
- plt.close("all")
- g = ag.PairGrid(self.df, hue="a", hue_order=order)
- g.map_diag(plt.plot)
- for line, level in zip(g.axes[0, 0].lines, order):
- x, y = line.get_xydata().T
- npt.assert_array_equal(x, self.df.loc[self.df.a == level, "x"])
- npt.assert_array_equal(y, self.df.loc[self.df.a == level, "x"])
- plt.close("all")
- g = ag.PairGrid(self.df, hue="a", hue_order=order)
- g.map_lower(plt.plot)
- for line, level in zip(g.axes[1, 0].lines, order):
- x, y = line.get_xydata().T
- npt.assert_array_equal(x, self.df.loc[self.df.a == level, "x"])
- npt.assert_array_equal(y, self.df.loc[self.df.a == level, "y"])
- plt.close("all")
- g = ag.PairGrid(self.df, hue="a", hue_order=order)
- g.map_upper(plt.plot)
- for line, level in zip(g.axes[0, 1].lines, order):
- x, y = line.get_xydata().T
- npt.assert_array_equal(x, self.df.loc[self.df.a == level, "y"])
- npt.assert_array_equal(y, self.df.loc[self.df.a == level, "x"])
- plt.close("all")
- def test_hue_order_missing_level(self):
- order = list("dcaeb")
- g = ag.PairGrid(self.df, hue="a", hue_order=order)
- g.map(plt.plot)
- for line, level in zip(g.axes[1, 0].lines, order):
- x, y = line.get_xydata().T
- npt.assert_array_equal(x, self.df.loc[self.df.a == level, "x"])
- npt.assert_array_equal(y, self.df.loc[self.df.a == level, "y"])
- plt.close("all")
- g = ag.PairGrid(self.df, hue="a", hue_order=order)
- g.map_diag(plt.plot)
- for line, level in zip(g.axes[0, 0].lines, order):
- x, y = line.get_xydata().T
- npt.assert_array_equal(x, self.df.loc[self.df.a == level, "x"])
- npt.assert_array_equal(y, self.df.loc[self.df.a == level, "x"])
- plt.close("all")
- g = ag.PairGrid(self.df, hue="a", hue_order=order)
- g.map_lower(plt.plot)
- for line, level in zip(g.axes[1, 0].lines, order):
- x, y = line.get_xydata().T
- npt.assert_array_equal(x, self.df.loc[self.df.a == level, "x"])
- npt.assert_array_equal(y, self.df.loc[self.df.a == level, "y"])
- plt.close("all")
- g = ag.PairGrid(self.df, hue="a", hue_order=order)
- g.map_upper(plt.plot)
- for line, level in zip(g.axes[0, 1].lines, order):
- x, y = line.get_xydata().T
- npt.assert_array_equal(x, self.df.loc[self.df.a == level, "y"])
- npt.assert_array_equal(y, self.df.loc[self.df.a == level, "x"])
- plt.close("all")
- def test_nondefault_index(self):
- df = self.df.copy().set_index("b")
- plot_vars = ["x", "y", "z"]
- g1 = ag.PairGrid(df)
- g1.map(plt.scatter)
- for i, axes_i in enumerate(g1.axes):
- for j, ax in enumerate(axes_i):
- x_in = self.df[plot_vars[j]]
- y_in = self.df[plot_vars[i]]
- x_out, y_out = ax.collections[0].get_offsets().T
- npt.assert_array_equal(x_in, x_out)
- npt.assert_array_equal(y_in, y_out)
- g2 = ag.PairGrid(df, "a")
- g2.map(plt.scatter)
- for i, axes_i in enumerate(g2.axes):
- for j, ax in enumerate(axes_i):
- x_in = self.df[plot_vars[j]]
- y_in = self.df[plot_vars[i]]
- for k, k_level in enumerate(self.df.a.unique()):
- x_in_k = x_in[self.df.a == k_level]
- y_in_k = y_in[self.df.a == k_level]
- x_out, y_out = ax.collections[k].get_offsets().T
- npt.assert_array_equal(x_in_k, x_out)
- npt.assert_array_equal(y_in_k, y_out)
- def test_dropna(self):
- df = self.df.copy()
- n_null = 20
- df.loc[np.arange(n_null), "x"] = np.nan
- plot_vars = ["x", "y", "z"]
- g1 = ag.PairGrid(df, vars=plot_vars, dropna=True)
- g1.map(plt.scatter)
- for i, axes_i in enumerate(g1.axes):
- for j, ax in enumerate(axes_i):
- x_in = df[plot_vars[j]]
- y_in = df[plot_vars[i]]
- x_out, y_out = ax.collections[0].get_offsets().T
- n_valid = (x_in * y_in).notnull().sum()
- assert n_valid == len(x_out)
- assert n_valid == len(y_out)
- def test_pairplot(self):
- vars = ["x", "y", "z"]
- g = ag.pairplot(self.df)
- for ax in g.diag_axes:
- assert len(ax.patches) > 1
- for i, j in zip(*np.triu_indices_from(g.axes, 1)):
- ax = g.axes[i, j]
- x_in = self.df[vars[j]]
- y_in = self.df[vars[i]]
- x_out, y_out = ax.collections[0].get_offsets().T
- npt.assert_array_equal(x_in, x_out)
- npt.assert_array_equal(y_in, y_out)
- for i, j in zip(*np.tril_indices_from(g.axes, -1)):
- ax = g.axes[i, j]
- x_in = self.df[vars[j]]
- y_in = self.df[vars[i]]
- x_out, y_out = ax.collections[0].get_offsets().T
- npt.assert_array_equal(x_in, x_out)
- npt.assert_array_equal(y_in, y_out)
- for i, j in zip(*np.diag_indices_from(g.axes)):
- ax = g.axes[i, j]
- nt.assert_equal(len(ax.collections), 0)
- g = ag.pairplot(self.df, hue="a")
- n = len(self.df.a.unique())
- for ax in g.diag_axes:
- assert len(ax.lines) == n
- assert len(ax.collections) == n
- def test_pairplot_reg(self):
- vars = ["x", "y", "z"]
- g = ag.pairplot(self.df, diag_kind="hist", kind="reg")
- for ax in g.diag_axes:
- nt.assert_equal(len(ax.patches), 10)
- for i, j in zip(*np.triu_indices_from(g.axes, 1)):
- ax = g.axes[i, j]
- x_in = self.df[vars[j]]
- y_in = self.df[vars[i]]
- x_out, y_out = ax.collections[0].get_offsets().T
- npt.assert_array_equal(x_in, x_out)
- npt.assert_array_equal(y_in, y_out)
- nt.assert_equal(len(ax.lines), 1)
- nt.assert_equal(len(ax.collections), 2)
- for i, j in zip(*np.tril_indices_from(g.axes, -1)):
- ax = g.axes[i, j]
- x_in = self.df[vars[j]]
- y_in = self.df[vars[i]]
- x_out, y_out = ax.collections[0].get_offsets().T
- npt.assert_array_equal(x_in, x_out)
- npt.assert_array_equal(y_in, y_out)
- nt.assert_equal(len(ax.lines), 1)
- nt.assert_equal(len(ax.collections), 2)
- for i, j in zip(*np.diag_indices_from(g.axes)):
- ax = g.axes[i, j]
- nt.assert_equal(len(ax.collections), 0)
- def test_pairplot_kde(self):
- vars = ["x", "y", "z"]
- g = ag.pairplot(self.df, diag_kind="kde")
- for ax in g.diag_axes:
- nt.assert_equal(len(ax.lines), 1)
- for i, j in zip(*np.triu_indices_from(g.axes, 1)):
- ax = g.axes[i, j]
- x_in = self.df[vars[j]]
- y_in = self.df[vars[i]]
- x_out, y_out = ax.collections[0].get_offsets().T
- npt.assert_array_equal(x_in, x_out)
- npt.assert_array_equal(y_in, y_out)
- for i, j in zip(*np.tril_indices_from(g.axes, -1)):
- ax = g.axes[i, j]
- x_in = self.df[vars[j]]
- y_in = self.df[vars[i]]
- x_out, y_out = ax.collections[0].get_offsets().T
- npt.assert_array_equal(x_in, x_out)
- npt.assert_array_equal(y_in, y_out)
- for i, j in zip(*np.diag_indices_from(g.axes)):
- ax = g.axes[i, j]
- nt.assert_equal(len(ax.collections), 0)
- def test_pairplot_markers(self):
- vars = ["x", "y", "z"]
- markers = ["o", "x", "s"]
- g = ag.pairplot(self.df, hue="a", vars=vars, markers=markers)
- assert g.hue_kws["marker"] == markers
- plt.close("all")
- with pytest.raises(ValueError):
- g = ag.pairplot(self.df, hue="a", vars=vars, markers=markers[:-2])
- class TestJointGrid(object):
- rs = np.random.RandomState(sum(map(ord, "JointGrid")))
- x = rs.randn(100)
- y = rs.randn(100)
- x_na = x.copy()
- x_na[10] = np.nan
- x_na[20] = np.nan
- data = pd.DataFrame(dict(x=x, y=y, x_na=x_na))
- def test_margin_grid_from_lists(self):
- g = ag.JointGrid(self.x.tolist(), self.y.tolist())
- npt.assert_array_equal(g.x, self.x)
- npt.assert_array_equal(g.y, self.y)
- def test_margin_grid_from_arrays(self):
- g = ag.JointGrid(self.x, self.y)
- npt.assert_array_equal(g.x, self.x)
- npt.assert_array_equal(g.y, self.y)
- def test_margin_grid_from_series(self):
- g = ag.JointGrid(self.data.x, self.data.y)
- npt.assert_array_equal(g.x, self.x)
- npt.assert_array_equal(g.y, self.y)
- def test_margin_grid_from_dataframe(self):
- g = ag.JointGrid("x", "y", self.data)
- npt.assert_array_equal(g.x, self.x)
- npt.assert_array_equal(g.y, self.y)
- def test_margin_grid_from_dataframe_bad_variable(self):
- with nt.assert_raises(ValueError):
- ag.JointGrid("x", "bad_column", self.data)
- def test_margin_grid_axis_labels(self):
- g = ag.JointGrid("x", "y", self.data)
- xlabel, ylabel = g.ax_joint.get_xlabel(), g.ax_joint.get_ylabel()
- nt.assert_equal(xlabel, "x")
- nt.assert_equal(ylabel, "y")
- g.set_axis_labels("x variable", "y variable")
- xlabel, ylabel = g.ax_joint.get_xlabel(), g.ax_joint.get_ylabel()
- nt.assert_equal(xlabel, "x variable")
- nt.assert_equal(ylabel, "y variable")
- def test_dropna(self):
- g = ag.JointGrid("x_na", "y", self.data, dropna=False)
- nt.assert_equal(len(g.x), len(self.x_na))
- g = ag.JointGrid("x_na", "y", self.data, dropna=True)
- nt.assert_equal(len(g.x), pd.notnull(self.x_na).sum())
- def test_axlims(self):
- lim = (-3, 3)
- g = ag.JointGrid("x", "y", self.data, xlim=lim, ylim=lim)
- nt.assert_equal(g.ax_joint.get_xlim(), lim)
- nt.assert_equal(g.ax_joint.get_ylim(), lim)
- nt.assert_equal(g.ax_marg_x.get_xlim(), lim)
- nt.assert_equal(g.ax_marg_y.get_ylim(), lim)
- def test_marginal_ticks(self):
- g = ag.JointGrid("x", "y", self.data)
- nt.assert_true(~len(g.ax_marg_x.get_xticks()))
- nt.assert_true(~len(g.ax_marg_y.get_yticks()))
- def test_bivariate_plot(self):
- g = ag.JointGrid("x", "y", self.data)
- g.plot_joint(plt.plot)
- x, y = g.ax_joint.lines[0].get_xydata().T
- npt.assert_array_equal(x, self.x)
- npt.assert_array_equal(y, self.y)
- def test_univariate_plot(self):
- g = ag.JointGrid("x", "x", self.data)
- g.plot_marginals(kdeplot)
- _, y1 = g.ax_marg_x.lines[0].get_xydata().T
- y2, _ = g.ax_marg_y.lines[0].get_xydata().T
- npt.assert_array_equal(y1, y2)
- def test_plot(self):
- g = ag.JointGrid("x", "x", self.data)
- g.plot(plt.plot, kdeplot)
- x, y = g.ax_joint.lines[0].get_xydata().T
- npt.assert_array_equal(x, self.x)
- npt.assert_array_equal(y, self.x)
- _, y1 = g.ax_marg_x.lines[0].get_xydata().T
- y2, _ = g.ax_marg_y.lines[0].get_xydata().T
- npt.assert_array_equal(y1, y2)
- def test_annotate(self):
- g = ag.JointGrid("x", "y", self.data)
- rp = stats.pearsonr(self.x, self.y)
- with pytest.warns(UserWarning):
- g.annotate(stats.pearsonr)
- annotation = g.ax_joint.legend_.texts[0].get_text()
- nt.assert_equal(annotation, "pearsonr = %.2g; p = %.2g" % rp)
- with pytest.warns(UserWarning):
- g.annotate(stats.pearsonr, stat="correlation")
- annotation = g.ax_joint.legend_.texts[0].get_text()
- nt.assert_equal(annotation, "correlation = %.2g; p = %.2g" % rp)
- def rsquared(x, y):
- return stats.pearsonr(x, y)[0] ** 2
- r2 = rsquared(self.x, self.y)
- with pytest.warns(UserWarning):
- g.annotate(rsquared)
- annotation = g.ax_joint.legend_.texts[0].get_text()
- nt.assert_equal(annotation, "rsquared = %.2g" % r2)
- template = "{stat} = {val:.3g} (p = {p:.3g})"
- with pytest.warns(UserWarning):
- g.annotate(stats.pearsonr, template=template)
- annotation = g.ax_joint.legend_.texts[0].get_text()
- nt.assert_equal(annotation, template.format(stat="pearsonr",
- val=rp[0], p=rp[1]))
- def test_space(self):
- g = ag.JointGrid("x", "y", self.data, space=0)
- joint_bounds = g.ax_joint.bbox.bounds
- marg_x_bounds = g.ax_marg_x.bbox.bounds
- marg_y_bounds = g.ax_marg_y.bbox.bounds
- nt.assert_equal(joint_bounds[2], marg_x_bounds[2])
- nt.assert_equal(joint_bounds[3], marg_y_bounds[3])
- class TestJointPlot(object):
- rs = np.random.RandomState(sum(map(ord, "jointplot")))
- x = rs.randn(100)
- y = rs.randn(100)
- data = pd.DataFrame(dict(x=x, y=y))
- def test_scatter(self):
- g = ag.jointplot("x", "y", self.data)
- nt.assert_equal(len(g.ax_joint.collections), 1)
- x, y = g.ax_joint.collections[0].get_offsets().T
- npt.assert_array_equal(self.x, x)
- npt.assert_array_equal(self.y, y)
- x_bins = _freedman_diaconis_bins(self.x)
- nt.assert_equal(len(g.ax_marg_x.patches), x_bins)
- y_bins = _freedman_diaconis_bins(self.y)
- nt.assert_equal(len(g.ax_marg_y.patches), y_bins)
- def test_reg(self):
- g = ag.jointplot("x", "y", self.data, kind="reg")
- nt.assert_equal(len(g.ax_joint.collections), 2)
- x, y = g.ax_joint.collections[0].get_offsets().T
- npt.assert_array_equal(self.x, x)
- npt.assert_array_equal(self.y, y)
- x_bins = _freedman_diaconis_bins(self.x)
- nt.assert_equal(len(g.ax_marg_x.patches), x_bins)
- y_bins = _freedman_diaconis_bins(self.y)
- nt.assert_equal(len(g.ax_marg_y.patches), y_bins)
- nt.assert_equal(len(g.ax_joint.lines), 1)
- nt.assert_equal(len(g.ax_marg_x.lines), 1)
- nt.assert_equal(len(g.ax_marg_y.lines), 1)
- def test_resid(self):
- g = ag.jointplot("x", "y", self.data, kind="resid")
- nt.assert_equal(len(g.ax_joint.collections), 1)
- nt.assert_equal(len(g.ax_joint.lines), 1)
- nt.assert_equal(len(g.ax_marg_x.lines), 0)
- nt.assert_equal(len(g.ax_marg_y.lines), 1)
- def test_hex(self):
- g = ag.jointplot("x", "y", self.data, kind="hex")
- nt.assert_equal(len(g.ax_joint.collections), 1)
- x_bins = _freedman_diaconis_bins(self.x)
- nt.assert_equal(len(g.ax_marg_x.patches), x_bins)
- y_bins = _freedman_diaconis_bins(self.y)
- nt.assert_equal(len(g.ax_marg_y.patches), y_bins)
- def test_kde(self):
- g = ag.jointplot("x", "y", self.data, kind="kde")
- nt.assert_true(len(g.ax_joint.collections) > 0)
- nt.assert_equal(len(g.ax_marg_x.collections), 1)
- nt.assert_equal(len(g.ax_marg_y.collections), 1)
- nt.assert_equal(len(g.ax_marg_x.lines), 1)
- nt.assert_equal(len(g.ax_marg_y.lines), 1)
- def test_color(self):
- g = ag.jointplot("x", "y", self.data, color="purple")
- purple = mpl.colors.colorConverter.to_rgb("purple")
- scatter_color = g.ax_joint.collections[0].get_facecolor()[0, :3]
- nt.assert_equal(tuple(scatter_color), purple)
- hist_color = g.ax_marg_x.patches[0].get_facecolor()[:3]
- nt.assert_equal(hist_color, purple)
- def test_annotation(self):
- with pytest.warns(UserWarning):
- g = ag.jointplot("x", "y", self.data, stat_func=stats.pearsonr)
- nt.assert_equal(len(g.ax_joint.legend_.get_texts()), 1)
- g = ag.jointplot("x", "y", self.data, stat_func=None)
- nt.assert_is(g.ax_joint.legend_, None)
- def test_hex_customise(self):
- # test that default gridsize can be overridden
- g = ag.jointplot("x", "y", self.data, kind="hex",
- joint_kws=dict(gridsize=5))
- nt.assert_equal(len(g.ax_joint.collections), 1)
- a = g.ax_joint.collections[0].get_array()
- nt.assert_equal(28, a.shape[0]) # 28 hexagons expected for gridsize 5
- def test_bad_kind(self):
- with nt.assert_raises(ValueError):
- ag.jointplot("x", "y", self.data, kind="not_a_kind")
- def test_leaky_dict(self):
- # Validate input dicts are unchanged by jointplot plotting function
- for kwarg in ("joint_kws", "marginal_kws", "annot_kws"):
- for kind in ("hex", "kde", "resid", "reg", "scatter"):
- empty_dict = {}
- ag.jointplot("x", "y", self.data, kind=kind,
- **{kwarg: empty_dict})
- assert empty_dict == {}
|