我有一个销售熊猫数据框,其中每一行代表一个公司名称,有四列显示过去五年的当前,最小,最高和平均销售额。
我想知道是否有办法在数据框内绘制最小值,最大值,平均值,当前水平条。
给你一个具体的例子: https://libguides.lib.umanitoba.ca/bloomberg/fixedincome
如果查看“范围”列,那正是我想要在数据框内复制的内容。我找到了matplotlib boxplot,但我认为我不能在数据框内绘制它们。
您知道任何解决方案吗?
答案 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.scatter
为current
和average
值创建积分。 当然,您必须稍微调整一下图形,使其看起来像您想要的那样。
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)
编辑(请参阅@ 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)
答案 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()
说实话,我不知道我放在一起的代码是否是我能用过的最好的代码,还有很多部分我还要理解。
请求,我最后一个问题是: 有人可以帮我在这个表中添加第一行“行”,我们用粗体显示每列的标题吗? 感谢