直方图下方和侧面的线图

时间:2014-05-14 16:22:54

标签: python matplotlib

这可能是我想要制作的一张不寻常的图表,所以我附上了一个插图。我不确定matplotlib是否可行,所以我想我会问这里怎么做。

http://i.imgur.com/96JRIN2l.jpg

基本上我想在其侧面绘制直方图(hist()),然后在顶部,覆盖线图(带plot()),保持轴相同在两边都是

此外,我认为只有直方图的不透明度较低时才会起作用。不确定是否可以按照每个图而不是每个图设置不透明度。

到目前为止

代码:

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

fig = plt.figure()
ax1 = fig.add_subplot(111)
line = [0.2, 0.3, 0.37, 0.4, 0.6, 0.7, 0.72, 0.75, 0.77, 0.78, 0.79, 0.795] 
distribution = [0.2, 0.3, 0.3, 0.4, 0.7, 0.7, 0.7, 0.8]

plt.hist(distribution, orientation='horizontal')
plt.plot(range(len(line)), line, color='grey')

plt.savefig("test.png")

直方图无法显示。

我该怎么做?

3 个答案:

答案 0 :(得分:4)

您只需要使用twinx / twiny两次来获得两个独立的轴(可能有这样的方法没有制作未使用的中轴,但这会照顾到一堆幕后细节:

import matplotlib.pyplot as plt
import numpy as np

line = [0.2, 0.3, 0.37, 0.4, 0.6, 0.7, 0.72, 0.75, 0.77, 0.78, 0.79, 0.795]
distribution = [0.2, 0.3, 0.3, 0.4, 0.7, 0.7, 0.7, 0.8]

fig, ax = plt.subplots(1, 1)

ax2 = ax.twinx()
ax3 = ax2.twiny()

ax.plot(line)
ax.set_xlabel('line xaxis')
ax.set_ylabel('line yaxis')

ax3.hist(distribution, orientation='horizontal', alpha=.5)
ax3.invert_xaxis()
ax3.set_xlabel('hist xaxis, note where 0 is')
# note this needs to be ax2 due to subtle overlay issues....
ax2.set_ylabel('hist yaxis')
plt.draw()

您必须使用轴的详细信息(限制,标签,刻度等),但axax3是独立的,您可以单独应用标准策略。

enter image description here

答案 1 :(得分:2)

我使用了你的代码,它渲染得很好,但随后我转而使用轴进行绘图,以获得更多的经验和更少的惊喜。使用轴绘图时,会生成Artist对象,但使用plt绘图时,会生成Artist对象列表。

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

fig = plt.figure()
ax  = plt.gca()

line = [0.2, 0.3, 0.37, 0.4, 0.6, 0.7, 0.72, 0.75, 0.77, 0.78, 0.79, 0.795] 
distribution = [0.2, 0.3, 0.3, 0.4, 0.7, 0.7, 0.7, 0.8]

ax.hist(distribution, orientation='horizontal', alpha=.5)
ax.plot(np.linspace(0,4,len(line)), line, color='grey', linewidth=2)

plt.show()

enter image description here

除此之外,还不清楚您希望看到的其他功能! matplotlib中有许多很棒的工具,以轴为中心的视角可能会让事情变得更加清晰。

答案 2 :(得分:1)

这是一个部分解决方案 - 我使用条形图而不是直方图,因为我无法弄清楚如何横向和叠加直方图。

from pylab import figure, show
import numpy as np
import matplotlib.pyplot as plt

people = ('Tom', 'Dick', 'Harry', 'Slim', 'Jim')
y_pos_hist = np.arange(len(people))
performance = 10*np.random.rand(len(people))

x_for_line = np.linspace(0,10)
y_for_line = np.cos(x_for_line)

fig = figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()


ax1.plot(x_for_line, y_for_line)
ax2.barh(y_pos_hist, performance, alpha=0.2)
#alpha = 0.2 is what changes the opacity of the bars

plt.yticks(y_pos_hist, people)

plt.show()

enter image description here

条形图部分来自this example

Consider this example, too