AroON_1106
@AroON_1106

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Matplotlibのplot()に無名関数が使えない理由

解決したいこと

初歩的な質問だったらすいません。
以下のようなコードを(Jupyterで)実行した際にエラーが出る理由を教えていただきたいです。

コード

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
%matplotlib inline

x = np.arange(-10,10)
plt.figure(figsize = (20, 6))
plt.plot(x, lambda x: 2*x)
plt.grid(True)

エラー

ValueError                                Traceback (most recent call last)
<ipython-input-10-b550b590b875> in <module>
      7 x = np.arange(-10,10)
      8 plt.figure(figsize = (20, 6))
----> 9 plt.plot(x, lambda x: 2*x)
     10 plt.grid(True)

~\anaconda3\lib\site-packages\matplotlib\pyplot.py in plot(scalex, scaley, data, *args, **kwargs)
   2838 @_copy_docstring_and_deprecators(Axes.plot)
   2839 def plot(*args, scalex=True, scaley=True, data=None, **kwargs):
-> 2840     return gca().plot(
   2841         *args, scalex=scalex, scaley=scaley,
   2842         **({"data": data} if data is not None else {}), **kwargs)

~\anaconda3\lib\site-packages\matplotlib\axes\_axes.py in plot(self, scalex, scaley, data, *args, **kwargs)
   1741         """
   1742         kwargs = cbook.normalize_kwargs(kwargs, mlines.Line2D)
-> 1743         lines = [*self._get_lines(*args, data=data, **kwargs)]
   1744         for line in lines:
   1745             self.add_line(line)

~\anaconda3\lib\site-packages\matplotlib\axes\_base.py in __call__(self, data, *args, **kwargs)
    271                 this += args[0],
    272                 args = args[1:]
--> 273             yield from self._plot_args(this, kwargs)
    274 
    275     def get_next_color(self):

~\anaconda3\lib\site-packages\matplotlib\axes\_base.py in _plot_args(self, tup, kwargs)
    397 
    398         if x.shape[0] != y.shape[0]:
--> 399             raise ValueError(f"x and y must have same first dimension, but "
    400                              f"have shapes {x.shape} and {y.shape}")
    401         if x.ndim > 2 or y.ndim > 2:

ValueError: x and y must have same first dimension, but have shapes (20,) and (1,)

質問の趣旨

無名関数を使わずにdefで関数を定義する、無名関数を変数に代入してから扱う(非推奨らしいですが)などをすることでエラーを回避できることは分かっていますが、なぜ直接無名関数を引数に入れたときだけエラーが発生するのかが分からないので、plot()と無名関数への理解を深めるために原因が知りたいです。
自分で調べてみても原因はわかりませんでしたがエラー文を読む限りなぜか無名関数が一回しか呼ばれてない(?)のかと予想しています。
回答よろしくおねがいします。

0

1Answer

それだと無名関数を定義しただけなので、関数そのものが渡されています。
↓のようにしてみてください。

plt.plot(x, (lambda x: 2*x)(x))
1Like

Comments

  1. @AroON_1106

    Questioner

    なるほど!すっきりしました
    ありがとうございます!

Your answer might help someone💌