Python 使用matplotlib改进勾选和栅格

Python 使用matplotlib改进勾选和栅格,python,matplotlib,data-visualization,Python,Matplotlib,Data Visualization,我有以下代码: import datetime from matplotlib.ticker import FormatStrFormatter from pylab import * hits=array([100,250,130,290]) misses=array([13,18,105,15]) X = np.arange(len(hits)) base=datetime.date(2014, 8, 1) date_list=array([base + datetime.timedel

我有以下代码:

import datetime
from matplotlib.ticker import FormatStrFormatter
from pylab import *

hits=array([100,250,130,290])
misses=array([13,18,105,15])
X = np.arange(len(hits))

base=datetime.date(2014, 8, 1)
date_list=array([base + datetime.timedelta(days=x) for x in range(0,len(hits))])

fig,ax = plt.subplots(1,1,1,figsize=(15,10))

bar_handles=[]
for i in range(len(hits)):
    bar_handles.append(
        ax.barh(
            -X[i],hits[i],facecolor='#89E07E', edgecolor='white',
            align='center',label="Impressions"))
    bar_handles.append(
        ax.barh(-X[i],-misses[i],facecolor='#F03255', edgecolor='white',
                align='center',label="Misses"))

for i in range(len(bar_handles)):
    patch = bar_handles[i].get_children()[0]
    bl = patch.get_xy()
    percent_x = 0.5*patch.get_width() + bl[0]
    percent_y = 0.5*patch.get_height() + bl[1]
    percentage=0
    if i%2==0:
        j=i/2
        percentage = 100*(float(hits[j])/float(hits[j]+misses[j]))
    else:
        j=(i-1)/2
        percentage = 100*(float(misses[j])/float(hits[j]+misses[j]))
    ax.text(percent_x,percent_y,"%d%%" % percentage,ha='center',va='center')

for i in range(len(hits)):
    plt.yticks(-X,date_list)
plt.tick_params(which='both', width=0)

max_hits_num=round(np.amax(hits),-2)
max_miss_num=round(np.amax(misses),-2)
xticks=np.arange(-max_miss_num,max_hits_num,50)
minorLocator = FixedLocator(xticks)
majorLocator = FixedLocator([0])
ax.xaxis.set_major_locator(majorLocator)
ax.xaxis.set_minor_locator(minorLocator)
ax.xaxis.set_minor_formatter(FormatStrFormatter('%d'))

ax.yaxis.grid(False)
ax.xaxis.grid(b=True,which='minor', color='0.5', linestyle='-',linewidth=1)
ax.xaxis.grid(b=True,which='major', color='b', linestyle='-',linewidth=2.5)

# ax2 = plt.twinx()
# ax2.grid(False)
# for i in range(len(hits)):
#     plt.yticks(-X,hits+misses)

plt.show()
这将生成以下图像:

我只剩下一个大问题和两个小问题。最大的问题是我想在右边的y轴上加上这些值的和。即加上113268235和305。尝试使用
twinx
share
a
subplot
这样的方法对我来说是行不通的

次要问题是:

  • 在x轴上,
    0
    左侧的值应不带减号
  • 如果仔细观察,您会看到蓝色主垂直网格线与灰色次垂直网格线重合。要是只有那件蓝色的就好了。这可以通过首先使用
    numpy.where
    xticks
    中查找
    0
    的索引来解决,然后使用
    numpy.delete
    删除该元素

  • 对于次要问题1:如果您使用python,您可以在创建图形时在脚本中修复此问题。
    ax.setxticklabels([str(abs(y))For y in ax.getxticklabels())
    我相信这应该可以实现,基本上您在设置轴时使用的是绝对值。我知道我在别的地方看到了!也许这个问题能帮上忙?