【问题标题】:Draw vertical line in seaborn pairplot [duplicate]在seaborn pairplot中绘制垂直线[重复]
【发布时间】:2021-03-01 22:03:54
【问题描述】:

我在 seaborn 中有以下情节代码

import seaborn as sns
import matplotlib.pyplot as plt

iris= sns.load_dataset("iris")

g= sns.pairplot(iris, 
             x_vars=["sepal_width", "sepal_length"],
            y_vars=["petal_width"])

这会产生以下输出

现在我正在尝试在 both 图上的x=3 处添加一条垂直线

我尝试过使用plt.axvline(x=3, ls='--', linewidth=3, color='red'),但它只在最后一个图上画线,如下所示

如何在两个图上绘制垂直线?

我尝试了g.map_offdiag(plt.axvline(x=1, ls='--', linewidth=3, color='red'))g.map() 变体,但是我收到以下错误。

TypeError                                 Traceback (most recent call last)
<ipython-input-12-612fcf2a7fef> in <module>
      9 
     10 # plt.axvline(x=3, ls='--', linewidth=3, color='red')
---> 11 g.map_offdiag(plt.axvline(x=1, ls='--', linewidth=3, color='red'))
     12 
     13 

~/PycharmProjects/venv/lib/python3.8/site-packages/seaborn/axisgrid.py in map_offdiag(self, func, **kwargs)
   1318                     if x_var != y_var:
   1319                         indices.append((i, j))
-> 1320             self._map_bivariate(func, indices, **kwargs)
   1321         return self
   1322 

~/PycharmProjects/venv/lib/python3.8/site-packages/seaborn/axisgrid.py in _map_bivariate(self, func, indices, **kwargs)
   1463             if ax is None:  # i.e. we are in corner mode
   1464                 continue
-> 1465             self._plot_bivariate(x_var, y_var, ax, func, **kws)
   1466         self._add_axis_labels()
   1467 

~/PycharmProjects/venv/lib/python3.8/site-packages/seaborn/axisgrid.py in _plot_bivariate(self, x_var, y_var, ax, func, **kwargs)
   1471     def _plot_bivariate(self, x_var, y_var, ax, func, **kwargs):
   1472         """Draw a bivariate plot on the specified axes."""
-> 1473         if "hue" not in signature(func).parameters:
   1474             self._plot_bivariate_iter_hue(x_var, y_var, ax, func, **kwargs)
   1475             return

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/inspect.py in signature(obj, follow_wrapped)
   3091 def signature(obj, *, follow_wrapped=True):
   3092     """Get a signature object for the passed callable."""
-> 3093     return Signature.from_callable(obj, follow_wrapped=follow_wrapped)
   3094 
   3095 

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/inspect.py in from_callable(cls, obj, follow_wrapped)
   2840     def from_callable(cls, obj, *, follow_wrapped=True):
   2841         """Constructs Signature for the given callable object."""
-> 2842         return _signature_from_callable(obj, sigcls=cls,
   2843                                         follow_wrapper_chains=follow_wrapped)
   2844 

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/inspect.py in _signature_from_callable(obj, follow_wrapper_chains, skip_bound_arg, sigcls)
   2214 
   2215     if not callable(obj):
-> 2216         raise TypeError('{!r} is not a callable object'.format(obj))
   2217 
   2218     if isinstance(obj, types.MethodType):

TypeError: <matplotlib.lines.Line2D object at 0x1287cc580> is not a callable object

有什么建议吗?

【问题讨论】:

    标签: python-3.x matplotlib seaborn


    【解决方案1】:

    最简单的方法是遍历轴并在每个轴上调用axvline()。请注意,.ravel() 将轴的二维数组转换为一维数组。

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    iris = sns.load_dataset("iris")
    
    g = sns.pairplot(iris,
                     x_vars=["sepal_width", "sepal_length"],
                     y_vars=["petal_width"])
    for ax in g.axes.ravel():
        ax.axvline(x=3, ls='--', linewidth=3, c='red')
    plt.show()
    

    要使用g.map() 或其变体,第一个参数需要是一个函数(不调用),然后是参数。所以,理论上它会是g.map(plt.axvline, x=1, ls='--', linewidth=3, color='red')。但是对于pairplot,映射函数会使用pairplot中的xy参数调用,这与x作为axvline的参数冲突。

    【讨论】:

    • 是的,我确实尝试了您所写的 g.map() 参数变体,但我收到了与多个 x 值有关的错误。现在我明白为什么了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多