绘制pandas数据帧内的水平条

时间:2018-03-19 14:27:25

标签: python dataframe matplotlib

我有一个销售熊猫数据框,其中每一行代表一个公司名称,有四列显示过去五年的当前,最小,最高和平均销售额。

我想知道是否有办法在数据框内绘制最小值,最大值,平均值,当前水平条。

给你一个具体的例子: https://libguides.lib.umanitoba.ca/bloomberg/fixedincome

如果查看“范围”列,那正是我想要在数据框内复制的内容。我找到了matplotlib boxplot,但我认为我不能在数据框内绘制它们。

您知道任何解决方案吗?

2 个答案:

答案 0 :(得分:1)

我不完全确定你到底想要什么,所以如果你还需要什么,请告诉我。

我使用pandas为图形创建了一些虚拟数据和matplotlib。

import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'current':[3,4,7], 'minimum':[1,3,2], 'maximum':[10,14,11], 'average':[8,5,9]})

#   average  current  maximum  minimum
#0        8        3       10        1
#1        5        4       14        3
#2        9        7       11        2

现在是重要的一部分。我有点从图像中重新创建了你的例子。此循环遍历数据框中的每一行,即您的公司。结果就像你有公司一样多的图表。

  • ax.plot创建一条从minimum值到的直线 maximum值。
  • ax.scattercurrentaverage值创建积分。

当然,您必须稍微调整一下图形,使其看起来像您想要的那样。

for index,row in df.iterrows(): 
    fig, ax = plt.subplots()
    ax.plot([df['minimum'][index],df['maximum'][index]],[0,0],zorder=0)      
    ax.scatter(df['current'][index],0,zorder=1)
    ax.scatter(df['average'][index],0,zorder=2)

这将是第一家公司的图表。 enter image description here

编辑(请参阅@ Andrea的评论):将绘制的数据放在一起

您可以按照上述方法调整图表的样式。

for index,row in df.iterrows(): 
    fig, ax = plt.subplots(figsize=(7, 0.2)) # adjust the width and height of the graphs
    ax.plot([df['minimum'][index],df['maximum'][index]],[0,0],color='gray',zorder=0)      
    ax.scatter(df['current'][index],0,zorder=1)
    ax.scatter(df['average'][index],0,marker='D',zorder=2)   
    plt.xticks([]) # disable the ticks of the x-axis
    plt.yticks([]) # disable the ticks of the y-axis   
    for spine in plt.gca().spines.values(): # disable the border around the graphs
        spine.set_visible(False)

这看起来非常接近您在问题中发布的图片。 enter image description here

答案 1 :(得分:0)

好的,基于NK_帮助和以下内容: Matplotlib- Creating a table with line plots in cells?

我设法把它放在一起:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

df = pd.DataFrame({'Name':["A","B","C","E","F"],'current':[3,4,7,6,6], 'minimum':[1,3,2,4,1], 'maximum':[10,14,11,7,10], 'average':[8,5,9,5,3]})


data = np.random.rand(100,5)
col1 = df["Name"]
col2 = df["current"]
col2colors = ["red", "g", "r", "r", "r"]
col3 = df["average"]
finalsc = "D+"

fig, axes = plt.subplots(ncols=5, nrows=5, figsize=(6,2.6),
                         gridspec_kw={"width_ratios":[1,1,1,3,3]})
fig.subplots_adjust(0.05,0.05,0.95,0.95, wspace=0.02, hspace=0.05)   #wspace, hspace --> bordi interni grigi della tabella

for ax in axes.flatten():
    ax.tick_params(labelbottom=0, labelleft=0, bottom=0, top=0, left=0, right=0)
    ax.ticklabel_format(useOffset=False, style="plain")
    for _,s in ax.spines.items():
        s.set_visible(True)

border = fig.add_subplot(111)
border.tick_params(labelbottom=0, labelleft=0, bottom=0, top=0, left=0, right=0)
border.set_facecolor("None")

text_kw = dict(ha="center", va="bottom", size=15)
for i,ax in enumerate(axes[:,0]):
    ax.text(0.5, 0.2, col1[i], transform=ax.transAxes, **text_kw)

for i,ax in enumerate(axes[:,1]):
    ax.text(0.5, 0.2, "{:.2f}".format(col2[i]),transform=ax.transAxes, **text_kw)
    ax.set_facecolor(col2colors[i])
    ax.patch.set_color(col2colors[i])

for i,ax in enumerate(axes[:,2]):
    ax.text(0.5, 0.2, "{:.2f}".format(col3[i]),transform=ax.transAxes, **text_kw)

for i,ax in enumerate(axes[:,3]):
    ax.plot(data[:,i], color="green", linewidth=1)

for i,ax in enumerate(axes[:,4]):
    ax.plot([df['minimum'][index],df['maximum'][index]],[0,0],zorder=0)      
    ax.scatter(df['current'][index],0,zorder=1)
    ax.scatter(df['average'][index],0,zorder=2)

plt.show()

说实话,我不知道我放在一起的代码是否是我能用过的最好的代码,还有很多部分我还要理解。

请求,我最后一个问题是: 有人可以帮我在这个表中添加第一行“行”,我们用粗体显示每列的标题吗? 感谢