Расположение XY для нескольких экземпляров местоположения на разных объектах - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь сгенерировать диаграммы рассеяния XY в следующем формате:

Example XY Scatter Plot

Мой фрейм данных (df) выглядит следующим образом:

enter image description here

Круги должны быть одного цвета, если номер карусели равен 1, 2, 3 или 4, и другого цвета, если 5 или больше.

Круг, показанный в разбросе по XY выше, центрируется как номинальный XY-координата и имеет радиус, равный TOLPL для описания.

Пока у меня есть некоторый (хитрый) код, который успешно генерирует множество цифр, но он показывает только одну точку XY (последнюю в цикле), а не все.

В идеале, цифры должны быть показаны 5 поперек и затем вниз, чтобы сформировать сетку, для каждого элемента в описании.

Код:


Изменить 12 сентября 2018 г. 15: 57

  • Добавить код для создания образца DataFrame с моими данными.
  • Очистите код, чтобы сделать его минимальным рабочим примером того, что у меня есть до сих пор.

df = {'DESCRIPTION': ['Hub Bore Top', 'Hub Bore Top', 'Hub Bore Top', 'Hub Bore Top', 'Hub Bore Top', 'Hub Bore Top', 'Hub Bore Top', 'Hub Bore Top', 'View Y Top Hole 1', 'View Y Top Hole 1', 'View Y Top Hole 1', 'View Y Top Hole 1', 'View Y Top Hole 1', 'View Y Top Hole 1', 'View Y Top Hole 1', 'View Y Top Hole 1', 'View Y Top Hole 1', 'View Y Top Hole 1', 'View Y Top Hole 1', 'View Y Top Hole 1', 'View Y Top Hole 1'],
'CAROUSEL': [1, 1, 1, 6, 6, 2, 2, 2, 6, 6, 6, 2, 2, 2, 6, 1, 1, 1, 1, 2, 6],
'AXIS': ['Y', 'Z', 'D', 'D', 'Z', 'Y', 'Z', 'D', 'Y', 'Y', 'X', 'D', 'X', 'Y', 'Z', 'D', 'Z', 'Y', 'X', 'Z', 'D'],
'NOMINAL': [0.000, 3.000, 85.000, 85.000, 3.000, 0.000, 3.000, 85.000, 0.000, -7.087, 94.234, 10.600, 94.234, -7.087, 11.000, 10.600, 11.000, -7.087, 94.234, 11.000, 10.600],
'MEAS': [0.081, 3.047, 85.013, 85.013, 3.001, 0.077, 2.992, 85.001, -0.038, -7.075, 94.478, 10.456, 94.479, -7.160, 11.000, 10.466, 11.000, -7.166, 94.487, 11.000, 10.405],
'TOLPL': [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.25, 0.25, 0.1, 0.25, 0.25, 0.1, 0.1, 0.1, 0.25, 0.25, 0.1, 0.1],
'TOLMI': [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.25, 0.25, 0.1, 0.25, 0.25, 0.1, 0.1, 0.1, 0.25, 0.25, 0.1, 0.1]
        }

feat = df

features = set(feat['DESCRIPTION'].tolist())
carousels = set(feat['CAROUSEL'].tolist())

for feat_idx, feature in enumerate(features): 
    feat = df

    for caro_idx, carousel in enumerate(carousels):
            # select all data for current carousel and store in feat
            feat = feat[feat['CAROUSEL']==carousel]

            feat = feat.pivot(index='DESCRIPTION', columns='AXIS', values=['MEAS', 'NOMINAL', 'TOLPL', 'TOLMI'])

            if caro_idx == 0:
                try:
                    # store data from current feature and carousel in variables
                    nominal_x = feat['NOMINAL'][['X']]['X'][feat_idx]
                    nominal_y = feat['NOMINAL'][['Y']]['Y'][feat_idx]
                    tol_rad = feat['TOLPL'][['X']]['X'][feat_idx]
                    description = feat.index[feat_idx]

                    # generate matplotlib graph with tolerance circle
                    fig, ax = plt.subplots(figsize=(2,2))
                    tol_circle = plt.Circle((nominal_x, nominal_y), tol_rad, color='grey', fill=False)
                    ax.set_xlim((nominal_x - 4*tol_rad, nominal_x + 4*tol_rad))
                    ax.set_ylim((nominal_y - 4*tol_rad, nominal_y + 4*tol_rad))
                    ax.add_artist(tol_circle)
                    ax.set(title=description, xlabel='x (mm)', ylabel='y (mm)')
                    colour='r'
                except:
                    pass
            # change plotted point colour if carousel number is 5 or greater
            elif caro_idx <4:
                colour = 'r'
            else:
                colour= 'b'

            # get the measured x, y, and d values
            meas_x = feat['MEAS'][['X']]['X'][feat_idx]
            meas_y = feat['MEAS'][['Y']]['Y'][feat_idx]
            meas_d = feat['MEAS'][['D']]['D'][feat_idx]

            # create a matplotlib circle with the measured x, y, and d values and plot them on current ax. 
            plot_circle = plt.Circle((meas_x, meas_y), tol_rad/4, color=colour)
            ax.add_artist(plot_circle)

Таким образом, в качестве обзора код создает списки всех уникальных «функций» в столбце описания и уникальных номеров карусели.

Затем я поворачиваю данные для определенного номера карусели, извлекаю значения для каждого объекта и затем строю его.Я не знаю, как это сделать правильно, вот почему это так хакерски!

Я боролся с этим последние пару дней и очень признателен за помощь!

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Публикация этого сообщения на случай, если кому-то понадобится сделать то же самое в будущем.

Мне удалось получить графики, которые я искал, с помощью огранки столбца matplotlib.Смотрите функцию ниже.

def x_y_pos_facet(dataframe):
    m = dataframe

    # Only select X and Y values
    m = m[((m['AXIS'] == 'X') | (m['AXIS'] == 'Y'))]

    # Move X and Y values into their own columns, and group by description and carousel.
    m = m.pivot_table(
        index=['DESCRIPTION', 'CAROUSEL'], columns=['AXIS'], values=['OFFSET'])

    # Move the DESCRIPTION CAROUSEL index into a single column. 
    n = m
    n = n.reset_index()

    # Reduce column multi index to single index
    n.columns = n.columns.map(''.join)

    #Graph styling. Also seperates the eight measured items into two groups with colours. 
    sns.set_style('whitegrid')
    colours = [
        'cobalt blue', 'cobalt blue', 'cobalt blue', 'cobalt blue',
        'bright orange', 'bright orange', 'bright orange', 'bright orange'
    ]
    colours = sns.color_palette(sns.xkcd_palette(colours))

    chart = sns.lmplot(
        x='OFFSETX',
        y='OFFSETY',
        data=n,
        hue='CAROUSEL',
        fit_reg=False,
        col='DESCRIPTION', #This is the magic! Creates a chart for each description item
        col_wrap=2, #Makes the graphs start a new row every two graphs.
        palette=colours)
chart.set(
    xlabel='X Axis Offset From Nominal (mm)',
    ylabel='Y Axis Offset From Nominal (mm)',
    xlim=(-1.6, 1.6),
    ylim=(-1.6, 1.6))
0 голосов
/ 13 сентября 2018

Давайте поработаем над этим:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(16, 10))


for k in range(1,5):

    ax = fig.add_subplot(2,2,k)

    ax.set_xlim((-2.0, 2.0))
    ax.set_ylim((-2.0, 2.0))

    x, y, z = np.random.rand(3)

    tol_circle = plt.Circle((x, y), np.random.rand(), color='grey', fill=False)

    ax.add_artist(tol_circle)

    ax.scatter(x, y)

    x, y, z = np.random.rand(3)

    plot_circle = plt.Circle((x, y), z, color='red', fill=False)
    ax.add_artist(plot_circle)

    ax.scatter(x, y)

plt.show()

Теперь, что вы пытаетесь сделать?

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...