Diagrama de dispersión agrupado, eje X categórico en Excel

Diagrama de dispersión agrupado, eje X categórico en Excel

Estoy intentando crear un diagrama de dispersión agrupado con un eje X categórico. Mis datos y mi intento de gráfico actual:

ingrese la descripción de la imagen aquí

Estoy tratando de agrupar todas las letras como puntos con el mismo valor de x, sin que se repita ninguna letra... por ejemplo, todas las D distribuidas verticalmente:

ingrese la descripción de la imagen aquí

¿Cómo puedo lograr esto?

Respuesta1

Aquí hay una solución:Excel: trazar diferentes valores de y encima de los mismos valores de x

Parece que el truco está en convertir las etiquetas en números (probablemente no hayan oído hablar de datos nominales y ordinales en ms, eh). Esto es bastante fácil de lograr mediante el contador de clasificación y suma acumulada. El problema es que el eje X es numérico y jugar manualmente con el espaciado como se sugiere más arriba puede no ser viable a gran escala.

Otro enfoque es fusionar los datos en una sola fila por categoría (eso es bastante sencillo, ya sea mediante fórmula o vba) y luego aplicar el diagrama de dispersión a la tabla. Esto creará una serie para cada columna, cada una con una forma de color del arco iris. Me imagino que corregirlos simultáneamente debería ser factible en vba con la propiedad de matriz correcta (no he examinado la documentación). Además, tener espacios en blanco mientras se genera el gráfico parece confundirlo, por lo que los reemplacé con valores de marcador de posición inicialmente (algo así como -412613) y luego, una vez que se genera el gráfico, reemplacé todos los marcadores de posición con espacios en blanco, eliminándolos convenientemente del gráfico. sin mayores consecuencias. Por lo tanto, es un gasto mayor de una sola vez para codificar y luego 2 minutos para aplicarlo.

O si tienes acceso a un mejor software de trazado, bueno...


Editar (30/06/19): Previa solicitud, los detalles técnicos se detallarán a continuación. Mis datos aleatorios están originalmente en A+C.

Cumsum:

B1=1 ; B2=if(a2=a1,b1,b1+1)

Fusionar usando la fórmula:

D1=1 ; D2 = if(a2=a1,0,1)
E1=if(index($a2:$a$999,column(a1),1)=$a1, _
      value(index($c2:$c$999,column(a1),1)),-0.413612)

Pegue E a lo largo de todas las filas y en tantas columnas como haya la mayor cantidad de observaciones; sabrá cuándo un filtro de la columna muestra solo un marcador de posición. Filtre según D=1, pegue los valores en otra hoja y elimine D. Personalmente, prefiero este método ya que es un poco más "multiplataforma" y funciona de forma gratuita.

Alternativa: fusionar usando vba:

Const BASESHEET As String = "Base"
Const MERGESHEET As String = "Merge2"

Sub MergePairs()
Dim rowcnt As Long
Dim srcsht
Dim trgsht
Dim pid As String
Dim stidx As Long
Dim trgidx As Long
Set srcsht = Sheets(BASESHEET)
Set trgsht = Sheets(MERGESHEET)

' Sort the data.
srcsht.Sort.SortFields.Clear
srcsht.Sort.SortFields.Add Key:=Range("$A:$A"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With srcsht.Sort
    .SetRange Range("$A:$C")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

' Copy unique ids.
rowcnt = srcsht.Cells(srcsht.Rows.Count, 1).End(xlUp).Row
srcsht.Range(srcsht.Cells(1, 1), srcsht.Cells(rowcnt, 1)).Copy
trgsht.Range("A1").PasteSpecial
trgsht.Range("$A:$A").RemoveDuplicates Columns:=1, Header:=xlNo

' Copy each set of points.
pid = ""
For i = 1 To rowcnt + 1
    If pid = "" Then
        pid = srcsht.Cells(i, 1).Value
        stidx = i
        trgidx = 1
    ElseIf pid <> srcsht.Cells(i, 1).Value Then
        srcsht.Range(srcsht.Cells(stidx, 3), srcsht.Cells(i - 1, 3)).Copy
        trgsht.Cells(trgidx, 2).PasteSpecial Paste:=xlPasteValues, _
            Operation:=xlNone, SkipBlanks:=False, Transpose:=True
        pid = srcsht.Cells(i, 1).Value
        stidx = i
        trgidx = trgidx + 1
    End If
Next i
End Sub

No olvide crear un gráfico seleccionando todos los valores y luego reemplazar todos los marcadores de posición con espacios en blanco.

Cambie TODOS los marcadores: Parece que las etiquetas de los ejes en un gráfico de dispersión no son fácilmente flexibles (posiblemente ni siquiera tengan permiso para hacerlo); por el contrario, es bastante sencillo deshacerse de las líneas en un gráfico de líneas. (Tenga en cuenta que esto cambia todos los gráficos de la hoja, así que asegúrese de que esté solo o modifique el bucle a un parámetro).

Sub XChart()
Dim chrt As ChartObject
Dim ser As Excel.Series
For Each chrt In Worksheets("Merge1").ChartObjects
    chrt.Chart.ChartType = xlLine
    For Each ser In chrt.Chart.SeriesCollection
        ser.Format.Line.Visible = msoFalse
        ser.MarkerStyle = xlMarkerStyleX
        ser.MarkerForegroundColor = RGB(0, 0, 0)
        ser.MarkerBackgroundColor = RGB(255, 255, 255)
        ser.MarkerSize = 7
    Next ser
Next chrt
End Sub

Algunas imágenes para la demostración a continuación.

Fase de selección:

Correo basura

Gráfico generado con estos datos (preste atención a la línea inferior de marcadores de posición):

Correo basura

Reemplazo de marcadores de posición con espacios en blanco:

Correo basura

Correo basura

Aquí está el resultado final, con cada gramo de vivacidad extraído de sus huesos.

Resultado final


Editar (24/04/20): Como me han informado, parece que las versiones de Excel 2013+ cambiaron la configuración del gráfico de líneas al eje de tipo de valor, aparentemente sin ningún medio para modificarlo. Sin embargo, los caracteres de columna/barra utilizan (todavía) un eje de tipo de categoría; Un posible truco de baja tecnología es crear un gráfico de líneas/dispersión como se describe, luego un segundo gráfico de barras de las etiquetas + valores 0 solamente; esto crea una cuadrícula vacía, que se puede limpiar de leyendas, marcas, etc. para dejar solo el eje horizontal. . Luego, la alineación de los dos gráficos es factible, aunque desagradable, ajustando el rango numérico de la dispersión (aproximadamente desde 0/1 hasta el número de etiquetas+) y el ancho y la posición de la columna. Baja tecnología Es posible obtener una referencia al eje (excel.) a través de Worksheets("Merge").ChartObjects(1).Chart.Axes(xlCategory,xlPrimary), donde las diferencias entre valor/categoría son bastante claras; no obstante, no respondió a ninguna solicitud de cambio de propiedad que intenté.

información relacionada