diff --git a/pandas/plotting/_matplotlib/core.py b/pandas/plotting/_matplotlib/core.py index b355cba6354da..37d9ed45d4050 100644 --- a/pandas/plotting/_matplotlib/core.py +++ b/pandas/plotting/_matplotlib/core.py @@ -579,13 +579,24 @@ def legend_title(self) -> Optional[str]: stringified = map(pprint_thing, self.data.columns.names) return ",".join(stringified) - def _add_legend_handle(self, handle, label, index=None): - if label is not None: - if self.mark_right and index is not None: - if self.on_right(index): - label = label + " (right)" - self.legend_handles.append(handle) - self.legend_labels.append(label) + def _mark_right_label(self, label: str, index: int) -> str: + """ + Append ``(right)`` to the label of a line if it's plotted on the right axis. + + Note that ``(right)`` is only appended when ``subplots=False``. + """ + if not self.subplots and self.mark_right and self.on_right(index): + label += " (right)" + return label + + def _append_legend_handles_labels(self, handle: Artist, label: str) -> None: + """ + Append current handle and label to ``legend_handles`` and ``legend_labels``. + + These will be used to make the legend. + """ + self.legend_handles.append(handle) + self.legend_labels.append(label) def _make_legend(self): ax, leg, handle = self._get_ax_legend_handle(self.axes[0]) @@ -1078,7 +1089,7 @@ def _make_plot(self): cbar.ax.set_yticklabels(self.data[c].cat.categories) if label is not None: - self._add_legend_handle(scatter, label) + self._append_legend_handles_labels(scatter, label) else: self.legend = False @@ -1170,6 +1181,7 @@ def _make_plot(self): kwds = dict(kwds, **errors) label = pprint_thing(label) # .encode('utf-8') + label = self._mark_right_label(label, index=i) kwds["label"] = label newlines = plotf( @@ -1182,7 +1194,7 @@ def _make_plot(self): is_errorbar=is_errorbar, **kwds, ) - self._add_legend_handle(newlines[0], label, index=i) + self._append_legend_handles_labels(newlines[0], label) if self._is_ts_plot(): @@ -1458,6 +1470,7 @@ def _make_plot(self): kwds = dict(kwds, **errors) label = pprint_thing(label) + label = self._mark_right_label(label, index=i) if (("yerr" in kwds) or ("xerr" in kwds)) and (kwds.get("ecolor") is None): kwds["ecolor"] = mpl.rcParams["xtick.color"] @@ -1508,7 +1521,7 @@ def _make_plot(self): log=self.log, **kwds, ) - self._add_legend_handle(rect, label, index=i) + self._append_legend_handles_labels(rect, label) def _post_plot_logic(self, ax: Axes, data): if self.use_index: @@ -1620,4 +1633,4 @@ def blank_labeler(label, value): # leglabels is used for legend labels leglabels = labels if labels is not None else idx for p, l in zip(patches, leglabels): - self._add_legend_handle(p, l) + self._append_legend_handles_labels(p, l) diff --git a/pandas/plotting/_matplotlib/hist.py b/pandas/plotting/_matplotlib/hist.py index 3de467c77d289..a02d9a2b9dc8d 100644 --- a/pandas/plotting/_matplotlib/hist.py +++ b/pandas/plotting/_matplotlib/hist.py @@ -89,6 +89,7 @@ def _make_plot(self): kwds = self.kwds.copy() label = pprint_thing(label) + label = self._mark_right_label(label, index=i) kwds["label"] = label style, kwds = self._apply_style_colors(colors, kwds, i, label) @@ -105,7 +106,7 @@ def _make_plot(self): kwds["weights"] = weights[:, i] artists = self._plot(ax, y, column_num=i, stacking_id=stacking_id, **kwds) - self._add_legend_handle(artists[0], label, index=i) + self._append_legend_handles_labels(artists[0], label) def _make_plot_keywords(self, kwds, y): """merge BoxPlot/KdePlot properties to passed kwds"""