当前位置: 首页 > 知识库问答 >
问题:

如何在条形图的条形图内显示值?

戚令秋
2023-03-14

我有一个这样的数据帧:

                 platform     count
release_year        
         1996    PlayStation   138
         1997    PlayStation   170
         1998    PlayStation   155
         1999    PC            243...

现在,我想绘制水平条形图,其中平台名称位于相应的条形图中,使其看起来像这样:

我该怎么做?

共有2个答案

乌鸿宝
2023-03-14
count = df["count"].tolist()
platform = df["platform"].tolist()

我不会把重点放在这个问题上。你可以从下面的网站上找到一些帮助

数据帧到列表1

数据框到列表2

一旦你得到下面的列表,

count = ['138','170','155','243','232']
platform =['PlayStation','PlayStation','PlayStation','PC','PlayStation']

注意:上面两个是条形图中的文本标签。

以下是完整的代码

import matplotlib.pyplot as plt
from numpy.random import rand
from numpy import arange

count = ['138','170','155','243','232']
platform =['PlayStation','PlayStation','PlayStation','PC','PlayStation']
def autolabel(rects):
# attach some text labels
    for ii,rect in enumerate(rects):
        width = int(rect.get_width())

        height = rect.get_height()
        print(height,width)
        yloc1=rect.get_y() + height /2.0
        yloc2=rect.get_y() + height /2.0
        if (width <= 5):
            # Shift the text to the right side of the right edge
            xloc1 = width + 1
            yloc2=yloc2+0.3
            # Black against white background
            clr = 'black'
            align = 'left'
        else:
            # Shift the text to the left side of the right edge
            xloc1 = 0.98*width
            # White on blue
            clr = 'white'
            align = 'right'
        yloc1=rect.get_y() + height /2.0
        print(xloc1,yloc1,yloc2)
        ax.text(xloc1,yloc1, '%s'% (count[ii]),horizontalalignment=align,
                         verticalalignment='center',color=clr,weight='bold',
                         clip_on=True)
        ax.text(5,yloc2, '%s'% (platform[ii]),horizontalalignment='left',
                         verticalalignment='center',color=clr,weight='bold',
                         clip_on=True)


val = [138,170,155,243,232]
print(val)# the bar lengths or count in your case
pos = [ 1996 , 1997,  1998,  1999,  2000]    # the bar centers on the y axis
print(pos)

fig = plt.figure()
ax = fig.add_subplot(111)
rects = ax.barh(pos,val, align='center',height=0.4)
print(rects)
autolabel(rects)
ax.set_ylabel('Year')
ax.set_xlabel('Count')
ax.set_title('horizontal bar chart')
ax.grid(False)
plt.savefig("horizontal.png")
plt.show()

您将非常感兴趣的部分:

def autolabel(rects):
    # attach some text labels
        for ii,rect in enumerate(rects):

            width =  rect.get_width()

            height = rect.get_height()

            yloc1=rect.get_y() + height /2.0
            yloc2=rect.get_y() + height /2.0
            if (width <= 5):
                # Shift the text to the right side of the right edge
                xloc1 = width + 1
                yloc2=yloc2+0.3
                # Black against white background
                clr = 'black'
                align = 'left'
            else:
                # Shift the text to the left side of the right edge
                xloc1 = 0.98*width
                # White on blue
                clr = 'white'
                align = 'right'
            yloc1=rect.get_y() + height /2.0

            ax.text(xloc1,yloc1, '%s'% (count[ii]),horizontalalignment=align,
                             verticalalignment='center',color=clr,weight='bold',
                             clip_on=True)
            ax.text(5,yloc2, '%s'% (platform[ii]),horizontalalignment='left',
                             verticalalignment='center',color=clr,weight='bold',
                             clip_on=True)

1) ii变量来自值为0到5的枚举。用于迭代我们的列表计数平台

2)为什么在函数中使用if/ther语句?这适用于宽度太小的情况。比方说,如果从val=[138,170,155,243,232]获得的第一个宽度减少到5 i. eval=[5,170,155,243,232]在这种情况下,输出将是。

我们基本上是为ax提供xloc(x坐标)和yloc(y坐标)值。text()函数。

ax.text(xloc1,yloc1, '%s'% (count[ii]),horizontalalignment=align,
                         verticalalignment='center',color=clr,weight='bold',
                         clip_on=True)
        ax.text(5,yloc2, '%s'% (platform[ii]),horizontalalignment='left',
                         verticalalignment='center',color=clr,weight='bold',
                         clip_on=True)

功能参数

文本(x、y、s、fontdict=None,withdash=False,**kwargs)

x, y:数据坐标

s:string,其他两个是可选的。

如果宽度是

最好是更改这些值,并查看输出如何更改,以便更好地理解它。

翟奇逸
2023-03-14

这是输入的数据。csv文件,一旦找到每个平台中的百分比:

Platform,Percent
Nintendo,34
PC,16
Playstation,28
Xbox,22

代码如下:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("data.csv", index_col=0)
df.plot(kind="barh", legend=False, width=0.8)
for i, (p, pr) in enumerate(zip(df.index, df["Percent"])):
    plt.text(s=p, x=1, y=i, color="w", verticalalignment="center", size=18)
    plt.text(s=str(pr)+"%", x=pr-5, y=i, color="w",
             verticalalignment="center", horizontalalignment="left", size=18)
plt.axis("off")
# xticks & yticks have empty lists to reduce white space in plot
plt.xticks([])
plt.yticks([])
plt.tight_layout()
plt.savefig("data.png")
 类似资料:
  • 问题内容: 需要查看条形图中的条形所代表的确切值,而不是Y轴上的近似值。 怎么可能呢? 谢谢阅读! 问题答案: 在iReport 3.7.6中,您可以仅选中BarPlot属性下的“显示标签”框。 在以前的版本(3.1.4)中,我必须创建一个ChartCustomizer类。 如果您需要格式化标签中的数字(例如,设置为百分比,添加千位分隔符等),那么即使在新版本中,您也绝对需要一个ChartCust

  • 问题内容: 我有一种情况,我需要在堆叠的多条形图-nvd3图中显示每个堆栈的值,因为我们可以在离散值-nvd3图中显示值。 我了解,“ showvalue”用于离散条形控制器中,是否可以在堆叠图中使用,如果没有,请提出替代解决方案。 提前致谢 问题答案: 目前不可能。该选项仅在离散条形图中可用。 从维护者处: 我们没有这种能力。堆叠/分组图表还具有复杂的动画,因此这很棘手。我们改用工具提示。 来源

  • 在一个html页面中,我有一个选择菜单(a, b, c, d)和一个条形图(a, b, c, d)。我想做的是在选择菜单中选择的条形图中突出显示相应的条形图。

  • 我使用chart.js在我的网页上有一个BarChart。 我在其中添加了两个数据点 现在我想要更新那些条A和B,而不是删除它们并再次添加它们(我已经想好了如何做到这一点)。我想让它们垂直移动以适应它们的新值,但我无法找到如何访问图表中已经存在的数据。 没有什么比得上 其中第一个值将是存储数据的索引(F.E.)。 我该怎么做呢?

  • 我是Python新手。我想在下图中显示每个箱上方的值: 这是我的代码: 这是我想要的图表: