2011-02-25 6 views
6

Esto me está volviendo loco. Estoy mostrando una nube de etiquetas basada en el conteo de una etiqueta en la base de datos basada en un valor%. Me di cuenta de que cuando se retrived una etiqueta, el tamaño de fuente asociado era enorme (ya que el 100% fue recuperado), por lo que algunos me propuso esto:Lógica de cálculo del tamaño de fuente de la nube de etiquetas

var tagSummaryNegative = from af in db.AgileFactors 
        join psf in db.ProjectStoryFactors on af.AgileFactorID equals psf.AgileFactorID 
        join s in db.Stories on psf.StoryID equals s.StoryID 
        join pim in db.ProjectIterationMembers on s.ProjectIterationMemberID equals pim.ProjectIterationMemberID 
        join it in db.Iterations on pim.ProjectIterationID equals it.ProjectIterationID 
        join pro in db.Projects on it.ProjectID equals pro.ProjectID 
        where pro.ProjectID == pro_id && 
          pro.ProjectID == it.ProjectID && 
          it.ProjectIterationID == pim.ProjectIterationID && 
          pim.ProjectIterationMemberID == s.ProjectIterationMemberID && s.StoryCategoryID == 1 && 
          s.StoryID == psf.StoryID && 
          psf.AgileFactorID == af.AgileFactorID 
        group af by af.Name into tagGroup 

        select new 
        { 

         Tag = tagGroup.Key, 
         tagCount = tagGroup.Count() 

        }; 

int maxTagFrequencyNegative = (from t in tagSummaryNegative select (int?)t.tagCount).Max() ?? 0; 

var tagCloudNegative = from af in db.AgileFactors 
        join psf in db.ProjectStoryFactors on af.AgileFactorID equals psf.AgileFactorID 
        join s in db.Stories on psf.StoryID equals s.StoryID 
        join pim in db.ProjectIterationMembers on s.ProjectIterationMemberID equals pim.ProjectIterationMemberID 
        join it in db.Iterations on pim.ProjectIterationID equals it.ProjectIterationID 
        join pro in db.Projects on it.ProjectID equals pro.ProjectID 
        where pro.ProjectID == pro_id && 
         pro.ProjectID == it.ProjectID && 
         it.ProjectIterationID == pim.ProjectIterationID && 
         pim.ProjectIterationMemberID == s.ProjectIterationMemberID && s.StoryCategoryID == 1 && 
         s.StoryID == psf.StoryID && 
         psf.AgileFactorID == af.AgileFactorID 
        group af by af.Name into tagGroup 
        select new 
        { 

         Tag = tagGroup.Key, 
         **weight = (tagGroup.Count() == 1) ? (double)1 : ((double)tagGroup.Count()/maxTagFrequencyNegative * 100)** 
        }; 

Ahora, cuando el número es 1, la fuente es pequeña, pero cuando 2, ha vuelto a ser enorme de nuevo. Las etiquetas con el recuento más pequeño se vuelven más pequeñas en relación con la etiqueta con el recuento más grande, pero necesito que comience pequeño y siga creciendo. ¡Por favor ayuda!

public string GetTagSize(double weight) 
{ 

    if (weight >= 99) 
     return "36pt"; 
    else if (weight >= 80) 
     return "29pt"; 
    else if (weight >= 64) 
     return "23pt"; 
    else if (weight >= 48) 
     return "18pt"; 
    else if (weight >= 32) 
     return "14pt"; 
    else if (weight >= 10) 
     return "11pt"; 
    else 
     return "8pt"; 
} 
+0

¿Cuál es el valor de 'maxTagFrequencyNegative'? ¿Por qué usarías un valor negativo para dividir? – Justin

+0

No es un valor negativo. Estoy usando LINQ ... maxTagFrequencyNegative es solo un alias para las etiquetas con historias negativas asociadas ... – user618616

+0

+1 por recomendar ser amable con las personas, solo fomenta una buena comunidad si premia respuestas te gustó/usaste –

Respuesta

0

Trate de usar

int expectedSize = 36; //Or whatever the max size should be 
double size = weight/tagGroup.count(); 
size = max(0, min(size, 1); //bounds size to between 1 and 0 just incase 
//I'm assuming tagGroup.count() returns the number of tags. replace this as need 

size = size * expectedSize; 

return (int)size + "pt"; 

La idea es que se obtiene el tamaño relativo de la etiqueta entre 1 y 0, entonces multiplique esto por el tamaño esperado.

Espero que ayude

0

Su problema parece ser el valor de maxTagFrequencyNegative.

Según su código: Cuando el peso es> 98, el tamaño de la fuente debería ser el más grande. Cuando pesa < 10, el tamaño de fuente es el más pequeño.

intente lo siguiente:

weight = (tagGroup.Count() == 1) ? 
    (double)1 : ((double)tagGroup.Count()/maxTagCount * 100) 

Dónde maxTagCount es el mayor número de etiquetas, para cualquier etiqueta dada.

Para probar esto, intente ajustar manualmente maxTagCount usted mismo a algo cercano al conteo de etiquetas más grande, y vea si sus resultados son razonables.

1

Puede usar Rad Tag Cloud Control y su trabajo será más fácil. Prueba esto.

Cuestiones relacionadas