【问题标题】:using the matplotlib .pylot for drawing histogram and the smooth curve which lies on the histogram使用 matplotlib .pyplot 绘制直方图和位于直方图上的平滑曲线
【发布时间】:2021-03-25 06:32:45
【问题描述】:

我尝试使用 matplotlib 和 pandas 绘制直方图,但是在绘制平滑曲线时它给了我一个错误我可以请你帮忙解决这个问题,也许给我一些方法来使用 matplotlib 在直方图上绘制平滑曲线我我试图不使用任何其他库(seaborn)这里是代码

mu,sigma = 100,15   
plt.style.use('dark_background')
x = mu + sigma * np.random.randn(10000)
n,bins,patches = plt.hist(x,bins=50,density=1,facecolor='g',alpha = 0.5)
zee=bins[:-1]
plt.plot(np.round(zee),patches,'ro')
plt.xlabel('Smarts')
plt.ylabel('Probablity')
plt.title('Histogram of the Iq')
plt.axis([40,160,0,0.03])
plt.grid(1)
plt.show()

显示的错误是

 python3 -u "/home/somesh/Downloads/vscode_code/python ml course /firstml.py"
Traceback (most recent call last):
  File "/home/somesh/Downloads/vscode_code/python ml course /firstml.py", line 149, in <module>
    plt.plot(np.round(zee),patches,'ro')
  File "/home/somesh/.local/lib/python3.8/site-packages/matplotlib/pyplot.py", line 2840, in plot
    return gca().plot(
  File "/home/somesh/.local/lib/python3.8/site-packages/matplotlib/axes/_axes.py", line 1745, in plot
    self.add_line(line)
  File "/home/somesh/.local/lib/python3.8/site-packages/matplotlib/axes/_base.py", line 1964, in add_line
    self._update_line_limits(line)
  File "/home/somesh/.local/lib/python3.8/site-packages/matplotlib/axes/_base.py", line 1986, in _update_line_limits
    path = line.get_path()
  File "/home/somesh/.local/lib/python3.8/site-packages/matplotlib/lines.py", line 1011, in get_path
    self.recache()
  File "/home/somesh/.local/lib/python3.8/site-packages/matplotlib/lines.py", line 658, in recache
    y = _to_unmasked_float_array(yconv).ravel()
  File "/home/somesh/.local/lib/python3.8/site-packages/matplotlib/cbook/__init__.py", line 1289, in _to_unmasked_float_array
    return np.asarray(x, float)
  File "/home/somesh/.local/lib/python3.8/site-packages/numpy/core/_asarray.py", line 85, in asarray
    return array(a, dtype, copy=False, order=order)
TypeError: float() argument must be a string or a number, not 'Rectangle'

这是否可以仅使用 matplotlib 库绘制平滑曲线

编辑1:感谢您的回答,我终于能够发现错误

【问题讨论】:

  • patches 是矩形,所以你不应该用它们来绘制任何东西。我认为您想针对zee 绘制n
  • 但是n的大小不同,显示参数必须是字符串或数字不是矩形
  • 你一定要再试一次:-)。
  • 如果不使用 scipy 的库,这是不可能的吗

标签: python-3.x matplotlib histogram curve


【解决方案1】:

在您的代码中,zee 是一个 matplotlibobject 矩形对象。但是,绘图函数需要 float 作为输入。

因为您正在绘制的是正态分布。此外,您希望曲线平滑。那么为什么不生成一个正态分布并将其绘制到同一个图中。这是您的代码的修改版本。

import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats

mu,sigma = 100,15   
plt.style.use('dark_background')
x = mu + sigma * np.random.randn(10000)
n,bins,patches = plt.hist(x,bins=50,density=1,facecolor='g',alpha = 0.5)

# zee=bins[:-1]
# plt.plot(np.round(zee),patches,'ro')
x_overlay = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
plt.plot(x_overlay, stats.norm.pdf(x_overlay, mu, sigma),"ro")

plt.xlabel('Smarts')
plt.ylabel('Probablity')
plt.title('Histogram of the Iq')
plt.axis([40,160,0,0.03])
plt.grid(1)
plt.show()

情节的输出:

【讨论】:

  • 为什么我们需要找到函数的pdf我们可以用`plt.plot(np.round(zee),n,'ro')`做同样的事情`
  • 我虽然您正在寻找数据的理论描述。这就是我猜你的“平滑曲线”的意思。如果您正在处理真实数据,您也可以进行拟合。
【解决方案2】:

nzee大小相同,即length(bins)-1

mu,sigma = 100,15   
plt.style.use('dark_background')
x = mu + sigma * np.random.randn(10000)
n,bins,patches = plt.hist(x,bins=50,density=1,facecolor='g',alpha = 0.5)
zee=bins[:-1]

## this
plt.plot(np.round(zee),n,'ro')

输出:

【讨论】:

  • 是的,我正是在寻找这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 2014-07-16
  • 2022-01-22
  • 2017-12-12
相关资源
最近更新 更多