Python 条形图上的未对齐值

Python 条形图上的未对齐值,python,matplotlib,Python,Matplotlib,我有点生气。我目前正在尝试在条形图的顶部绘制条形图值,但这些值未对齐。是否可以将值放入相应的条形图中?我四处挖掘,发现这在一定程度上帮助了我: 下面是情节的样子: 我的代码: import pandas as pd import matplotlib.pyplot as plt from matplotlib.lines import Line2D import matplotlib df = pd.DataFrame({'Years': ['2015

我有点生气。我目前正在尝试在条形图的顶部绘制条形图值,但这些值未对齐。是否可以将值放入相应的条形图中?我四处挖掘,发现这在一定程度上帮助了我:

下面是情节的样子:

我的代码:

    import pandas as pd
    import matplotlib.pyplot as plt
    from matplotlib.lines import Line2D
    import matplotlib

    df = pd.DataFrame({'Years': ['2015', '2016', '2017', '2018'],
                       'Value': [-495982.0, 405549.0, -351541.0, 283790.0]})
    values = df["Value"]
    #values = values / 1e3
    asOfDates = df['Years']

    Value = df['Value'] / 1000

    fig, ax, = plt.subplots()
    xlocs, xlabs = plt.xticks()
    ax.set_title('Plotting Financials')
    ax.set_xlabel('Years')
    ax.set_ylabel('value')
    plt.bar(asOfDates, values, color=['r' if v < 0 else 'g' for v in values])
    ax.get_yaxis().set_major_formatter(matplotlib.ticker.FuncFormatter(lambda x, p: format(int(x), ',')))
    for i, v in enumerate(values):
        ax.text(v + 3, i + .25, str(v), fontweight='bold')
        ax.text(xlocs[i] - 0.15, v + 0.01, str(v))

    plt.show()
将熊猫作为pd导入
将matplotlib.pyplot作为plt导入
从matplotlib.lines导入Line2D
导入matplotlib
df=pd.DataFrame({'Years':['2015','2016','2017','2018'],
'值':[-495982.0405549.0,-351541.0283790.0]})
值=df[“值”]
#值=值/1e3
asOfDates=df[“年”]
Value=df['Value']/1000
图,ax,=plt.子批次()
xlocs,xlabs=plt.xticks()
ax.集合标题(“绘制财务数据”)
ax.set_xlabel('年')
ax.set_ylabel('值')
plt.bar(如果v<0,则为'r',如果v为值,则为'g'))
ax.get_yaxis().set_major_格式化程序(matplotlib.ticker.FuncFormatter(lambda x,p:format(int(x),','))
对于枚举中的i,v(值):
ax.text(v+3,i+0.25,str(v),fontwweight='bold')
ax.text(xlocs[i]-0.15,v+0.01,str(v))
plt.show()

您将调用中x和y值的位置切换到了
ax.text()
。此外,你不需要它两次。您还可以使用
1.05
或其他一些值作为控制y值的因子

for i, v in enumerate(values):
    ax.text(i , v*1.05, str(v), fontweight='bold', va='center', ha='center')

与相关,尽管它是针对单杠的。您可以使用
f'{v:,.0f}'
而不是
str(v)
来获得更友好的格式数字