matplotlib将stddev轴的正态分布覆盖到另一个图上

时间:2015-10-16 15:31:10

标签: python pandas matplotlib

我从教程网站上读到了一系列数据。 我已经设法在该数据中绘制电视列的分布,但是我还想在第二个x轴上用StdDev刻度覆盖正态分布曲线(所以我可以比较两条曲线)。我正在努力弄清楚如何做到这一点..

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
import matplotlib.mlab as mlab
import math

# read data into a DataFrame
data = pd.read_csv('http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv', index_col=0)

# draw distribution curve
h = sorted(data.TV)
hmean = np.mean(h)
hstd = np.std(h)
pdf = stats.norm.pdf(h, hmean, hstd)
plt.plot(h, pdf)

这是一张接近我所追求的图表,其中x是StdDeviations。所有这个例子都需要第二个x轴来显示data.TV

的值

example image

2 个答案:

答案 0 :(得分:1)

好的,假设您想要绘制数据的分布,使用两个x轴绘制拟合的正态分布,实现此目的的一种方法如下。

规范化数据与标准正态分布一起绘制。然后使用matplotlib的{​​{1}}向绘图添加第二个x轴。在第二个轴上使用与原始x轴相同的刻度位置,但缩放标签以获得相应的原始twiny()值。结果如下:

enter image description here

代码

TV

答案 1 :(得分:0)

不确定你真正想要什么,但你可能会像这样使用第二轴

import pandas as pd 
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
import matplotlib.mlab as mlab
import math

# read data into a DataFrame
data = pd.read_csv('Advertising.csv', index_col=0)

fig, ax1 = plt.subplots()

# draw distribution curve
h = sorted(data.TV)
ax1.plot(h,'b-')
ax1.set_xlabel('TV')
ax1.set_ylabel('Count', color='b')
for tl in ax1.get_yticklabels():
    tl.set_color('b')

hmean = np.mean(h)
hstd = np.std(h)
pdf = stats.norm.pdf(h, hmean, hstd)

ax2 = ax1.twinx()
ax2.plot(h, pdf, 'r.')
ax2.set_ylabel('pdf', color='r')
for tl in ax2.get_yticklabels():
    tl.set_color('r')

plt.show()