3

我的这部分代码生成图 (1) 中的条形图。我想知道如何修改它以生成图(2)中的条形图,它更具可读性。

axs[4].set_xticks(range(N))
axs[4].set_xticklabels(words[inds],rotation = 'vertical')
axs[4].set_xlabel('word')
axs[4].set_yscale('log')
axs[4].set_ylabel('pagerank')
axs[4].set_title('Sorted PageRank biased by total word frequencies (c = '+str(c4)+')')
axs[4].bar(range(N),p4[inds],lw=2.5, align='center')

plt.subplots_adjust(hspace=.5)

plt.savefig('./figures/pageranks.pdf')
4

2 回答 2

2

使用pylab.step而不是 pylab.bar 可以提供更接近您想要的东西。它采用相同的参数,bars但绘制“步骤”而不是“条”。

import pylab as p
ax = p.gca()
xbins = p.linspace(0.,10.,10)
step_heights = [10, 9, 9, 9, 7, 6, 6, 5, 4, 3]
ax.step(xbins, step_heights, linewidth=2.5, color="k",where="mid")
ax.set_ylim(0.,11.)

阶梯图

您可能还想查看更完整的pylab.hist文档。

于 2013-09-08T09:02:43.127 回答
2

您可以定义自己的函数,并使用它plt.hlines来绘制水平线。如果您想在某个轴上绘制它,只需将此轴作为参数提供给ax参数。

import matplotlib.pyplot as plt
import numpy as np

def bar_tops(x, y, width=0.8, align='center', ax=None, **kwargs):
    x = np.array(x)
    y = np.array(y)
    if align == 'center':
        left = x - 0.5 * width
        right = x + 0.5 * width
    elif align == 'edge':
        left = x
        right = x + width
    if ax == None:
        ax = plt.gca()
    ax.hlines(y, left, right, **kwargs)

示例用法:

bar_tops(np.arange(10), np.sort(np.random.rand(10)), lw=2)
plt.show()

输出

于 2013-09-08T09:39:43.277 回答