动态直方图子图,带有标记目标的线

时间:2018-08-31 09:07:40

标签: python-3.x pandas matplotlib subplot

我一直在尝试发布一些类似的解决方案,以便运气不佳。

我正在尝试获取制造过程中所有List<CTITools> tools; tools = Arrays.asList( new CTITools("DFC"), new CTITools("AgentInfo"), new CTITools("Customer")); new CTITools("Wiki")); Grid<CTITools> grid = new Grid<>(); grid.setItems(tools); grid.addColumn(CTITools::getTool).setCaption("Tool"); 的{​​{1}}的直方图。每个零件有不同的步骤数,因此我想在每个零件的一个图/图像上具有一组直方图。

在我的真实数据中,有很多部分,因此,如果这可以遍历许多部分并保存理想的图形。

此外,对于要覆盖在直方图上的每个步骤,我们都有一个目标成本。这在单独的数据框中表示。我陷入了子图的循环中,所以我还没有尝试过。

这里与我所能找到的每一步直方图应该是的样子非常接近: Example of what I'm picturing

到目前为止,这是我的代码:

Cost

预先感谢您对我的帮助!

这是我想在直方图上显示为垂直线的Step No

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_excel('Dist_Example.xlsx')
df1 = df[~df['Cost Type'].isin(['Material'])]
number_of_subplots = len(df1['Step No'].unique())
steps = df1['Step No'].unique()
fig, axs = plt.subplots(1, number_of_subplots, sharey = True, tight_layout=True)
for step in steps:
    df2 = df1[df1['Step No'].isin([step])]
    axs[step].hist(df2['Cost'])
plt.show()

以下是一些示例历史数据,应放在直方图的bin中:

Target Cost

还有第二个样本数据集:

PartNo  StepNo  TargetCost
ABC     10      12
ABC     20      20
ABC     30     13

1 个答案:

答案 0 :(得分:0)

您将找不到可以直接为数据集解决此问题的直方图函数。您需要以适合自己需求的方式汇总数据,然后用条形图表示结果。

我发现您的目标和数据有点令人困惑,但是我认为在给出这些假设之后,我已经弄清了您的想法:

  1. 您要汇总每个步骤编号的费用
  2. 成本类型无关
  3. 由于您要汇总每个步骤号中的所有费用,因此必须计算总目标费用。

剧情

enter image description here

编辑

这不是OP想要的。经过一番来回的摸索,我们发现了一个似乎可行的解决方案

  

(从问题开始)我正在尝试获取所有步骤号的成本直方图

     

(来自评论)我实际上想对每个步骤中每个序列号的成本之和有一个直方图。

由于直方图中的y轴上必须有count或频率,因此您必须以某种有意义的方式汇总数据。在下面,您将看到在每个步骤中每个SerialNO的合计成本的选择箱数计数。

结果:

enter image description here

代码:

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
import pylab


# Load data in two steps:
# df1 = pd.read_clipboard(sep='\\s+')
# Part No Serial No   Step No Cost Type   Cost
# ABC      123        10      Labor       11
# ABC      123        10      Material    16
# ABC      456        10      Labor       21
# ABC      456        10      Material    26
# ...

# df2 = pd.read_clipboard(sep='\\s+')
# Part No Step No Target Cost
# ABC     10      12
# ABC     20      20
# ABC     30     13

# Cost type and SerialNo irrelevant
df11 = df1.drop(['CostType'] , axis = 1)

# Aggregate by StepNo, find total cost and count
##df12 = df11.groupby(['PartNo', 'StepNo']).agg(['sum', 'count']).reset_index()
df12 = df11.groupby(['PartNo', 'StepNo', 'SerialNo']).agg(['sum', 'count']).reset_index()

df12.columns = ['PartNo', 'StepNo', 'SerialNo', 'Cost', 'Count']
df3 = pd.merge(df2, df12, how = 'left', on = ['PartNo', 'StepNo'])

# Calculate total target cost
df3['TargetTotal'] = df3['TargetCost']*df3['Count']

# pylab.rcParams['figure.figsize'] = (2, 1)

def multiHist(x_data, x_label, bins):

    # Hisrogram setup
    fig, ax = plt.subplots()
    ax.hist(x_data, bins=bins, color='blue', alpha=0.5, histtype='stepfilled')

    # Horizontal line
    x0 = dfs['TargetTotal'].iloc[0]
    ax.axvline(x0, color='red', linewidth=2)

    # Annotation
    ax.annotate('Target: {:0.2f}'.format(x0), xy=(x0, 1), xytext=(-15, 15),
            xycoords=('data', 'axes fraction'), textcoords='offset points',
            horizontalalignment='left', verticalalignment='center',
            arrowprops=dict(arrowstyle='-|>', fc='white', shrinkA=0, shrinkB=0,
                            connectionstyle='angle,angleA=0,angleB=90,rad=10'),)

    # Labels
    ax.set_xlabel(x_label, color = 'grey')
    ax.legend(loc='upper left')
    plt.show()

# Identify and plot  data for each StepNo
for step in df3['StepNo'].unique():
    dfs = df3[df3['StepNo']==step]

    # Data to plot
    cost = dfs['Cost']
    labels = 'Part: ' + dfs['PartNo'].iloc[0] + ', ' 'Step:' + str(dfs['StepNo'].iloc[0])

    # Plot
    multiHist(x_data = cost, x_label = labels, bins = 4)