jueves, 29 de diciembre de 2011

Instalar JFreeChart en Netbeans

Para mi PFC necesito mostrar determinados datos mediante gráficas. Java tiene muchas opciones para hacer esto. Al principio pensé en usar simplemente Java2D, pero más tarde barajé la opción de trabajar con alguna biblioteca con un mayor nivel de abstracción.

JFreeChart es una biblioteca que simplifica muchísimo la tarea de mostrar gráficas. El proceso es sencillo: Primero construimos un objeto Dataset, con el que podremos introducir los datos del gráfico, después creamos un objeto ChartFactory, e invocamos al método createXChart() con el que podremos establecer el título de la tabla, el Dataset asociado y otros parámetros (leyenda, ejes, etc.).

Para instalar la librería en NetBeans 7 haremos lo siguiente:

1. Descargamos los archivos necesarios:

Última versión de JFreeChart

Ant (necesario para generar la documentación Javadoc)

NetBeans (Yo utilizo la versión SE)

2. Descomprimimos JFreeChart en un directorio (yo hice una carpeta “Libraries” para guardar todas las librerías).

3. (Opcional) Descomprimimos Ant. En Windows es necesario añadir las variables de entorno ANT_HOME para que apunte al directorio donde esté Ant. También es necesario añadir al PATH de Windows el directorio Bin de Ant y el directorio Bin de JDK. Una vez hecho esto, mediante línea de comandos accedemos a la carpeta donde hemos descomprimido JFreeChart y dentro de esta, a la subcarpeta Ant:

Captura

4. (Opcional) Ejecutamos el comando para generar la documentación Javadoc:

Captura2

Si todo ha ido bien, al cabo de unos segundos (pueden ser bastantes) el sistema mostrará “BUILD SUCCESSFUL”, indicando que la documentación se ha generado correctamente:

Captura3

3. En NetBeans pulsamos en Tools > Libraries para añadir JFreeChart. Para ello pulsamos en el botón “New Library…”

En Library name escribimos el nombre que queremos darle a la librería (en mi caso he optado por JFreeChart-1.0.14).

En Library Type seleccionamos Class Libraries y pulsamos OK.

Ahora nuestra librería aparecerá en la lista izquierda de la ventana. Sólo nos queda añadir las referencias de la misma:

En la pestaña Classpath, pulsamos “Add JAR/Folder…” y seleccionamos los archivos jcommon y jfreechart, que se encuentran en la subcarpeta lib de JFreeChart:

Captura4

Captura5

En la pestaña Sources añadimos la subcarpeta source de JFreeChart:

Captura6

Si hemos seguido los pasos opcionales, tendremos generada la documentación en Javadoc, así que en en la pestaña Javadoc añadimos la subcarpeta Javadoc (no estará si no hemos generado la documentación, pero no es necesaria para el funcionamiento de la librería):

Captura7

Terminamos pulsando en OK, y ya tendremos todo instalado.

Para probar que todo funcione correctamente podemos utilizar el código que escribí para probarlo:

package jfcexample;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;

/**
*
* @author Manuel
*/
public class First {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
       
        // Creamos el DataSet
        DefaultPieDataset dataset = new DefaultPieDataset();
       
        // Establecemos unas categorías de ejemplo
        dataset.setValue("Ej1",43.2);
        dataset.setValue("Ej2",27.9);
        dataset.setValue("Ej1",79.5);
       
        // Creamos la tabla
        JFreeChart chart = ChartFactory.createPieChart(
                "Sample Pie Chart",
                dataset,
                true,
                true,
                false
                );
       
        // Mostramos la tabla
        ChartFrame frame = new ChartFrame("Test",chart);
        frame.pack();
        frame.setVisible(true);
    }
}

Si todo está correcto, al ejecutarlo deberíamos obtener lo siguiente:

Captura8

NOTA: Aunque si no seguimos los pasos opcionales no tendremos la documentación en Javadoc, siempre podemos consultarla online en la página oficial.

martes, 14 de junio de 2011

Leer datos de Excel con Python

Para mi PFC necesito leer datos directamente de ficheros Excel. He encontrado una librería que nos facilita la tarea: xlrd.

Dicha librería sólo sirve para tareas de lectura. Si queremos escribir existe otra equivalente, que en este caso se llama xlwt.

Ambas son compatibles con ficheros Excel 97, 2000, XP y 2003.

Para abrir una archivo de Excel, basta con hacer:

excel = xlrd.open_worbook("hoja.xls")

Ahora podemos seleccionar una hoja por su nombre:

hoja = excel.sheet_by_name("hoja 1")

Aunque también podríamos hacerlo por índices.

Dejo un ejemplo completo con las funciones más básicas:


import xlrd


''' Return a xlrd.sheet object with the Excel sheet information.
   
    Arguments:
    filename -- Location of Excel file.
    sheetname -- The name of the Excel page ie:"Testing".
'''
def open_xls(filename,sheetname):
    # Open the workbook
    wb = xlrd.open_workbook(filename,formatting_info=True)
   
    # Select the sheet
    sh = wb.sheet_by_name(sheetname)
   
    # Returns the sheet
    return sh


''' Returns a list of ParetoFront individuals fitness in with format
    [Obj1Fitness,Obj2Fitness].
   
    Arguments:
    sheet -- The Excel sheet returned from open_xls() function.
    iteration -- The iteration to obtain the Pareto Front.
'''
def get_pf(sheet,iteration):
    ind_fitness = list()
   
    # Iterate through rows
    for rownum in range(sheet.nrows):
        # Select only individuals in given iteration
        if sheet.cell_value(rownum,0) == iteration:
            # Save [Obj1NSGA2,Obj2NSGA2] of PF individuals
            if sheet.cell_xf_index(rownum,1) != sheet.cell_xf_index(rownum,2):
                ind_fitness.append([sheet.cell_value(rownum,5),sheet.cell_value(rownum,4)])
   
    return ind_fitness
           
   
def main():
    sheet = open_xls("BestsFinal.xls","Training")
    print get_pf(sheet,2)

    return 0

if __name__ == '__main__':
    main()

domingo, 12 de junio de 2011

Crear enlaces simbólicos en Windows

Para complementar la entrada anterior, comento como crear enlaces simbólicos en Windows (al parecer, este método sólo es válido con Windows Vista o 7).

Primero abrimos una consola de administrador (Inicio, escribimos cmd y con el botón derecho en el programa seleccionamos "Ejecutar como administrador").

A continuación podemos hacer el enlace, la sintaxis es:

mklink /D (directorio-destino) (directorio-enlazado)

Por ejemplo, ayer necesitaba que toda mi música estuviera disponible desde el directorio C:\jukloud\static\songs . Mi primera idea fue copiar todo mi directorio de música a dicha carpeta. Pero simplemente basta con hacer:

mklink /D C:\jukloud\static\songs "F:\Mi Musica"

Las comillas del último directorio son necesarias porque tiene espacios.

La única cosa a tener en cuenta es que el directorio destino NO debe existir previamente, ya que será creado como directorio simbólico con la orden mklink.

lunes, 6 de junio de 2011

Crear enlaces simbólicos en Linux

Hoy he actualizado Iceweasel (Firefox en Debian) a su versión 4. Firefox, sin embargo está en una versión anterior en los repositorios, por lo que mi idea ha sido borrar firefox y hacer un enlace simbólico a Iceweasel, consiguiendo así que cualquier programa que llamase a Firefox, llamase ahora a Iceweasel.

Para ello, la sintaxis es la siguiente:

sudo ln -s (origen) (destino)

Que en mi caso era:
 
sudo ln -s /usr/bin/iceweasel /usr/bin/firefox

Con esto creamos un enlace simbólico llamado firefox en /usr/bin, que es donde antes de desinstalarlo estaba el ejecutable de Firefox 3. Ahora al escribir firefox en consola, llamará al enlace, que a su vez ejecutará /usr/bin/iceweasel.

Nota: Si en algún momento queremos deshacer el enlace, bastará con ejecutar:

sudo unlink /usr/bin/firefox

jueves, 19 de mayo de 2011

Modificar tamaño de pestañas en Eclipse (Linux)

Actualmente estoy probando Linux Mint Debian Edition, y uno de los problemas que le veo (y que también me pasaba en Ubuntu, por lo que supongo que será más cosa de Gnome) es que la interfaz se come demasiado espacio de la pantalla. Sin embargo, aunque en los temas GTK+ esto se puede arreglar más o menos a base de usar temas compactos y/o modificar el tamaño de las tipografías, en programas con interfaces gráficas no nativas (por ejemplo Eclipse) no sirven estas soluciones.

He buscado y he encontrado un par de soluciones en StackOverflow y UbuntuGeek

http://ubuntuforums.org/showthread.php?t=1465712&page=2

http://stackoverflow.com/questions/2743647/gigantic-tabs-in-eclipse-on-ubuntu

Básicamente ambas consisten en crear un archivo llamado .gtkrc-2.0 en nuestra carpeta home e incluir en él lo siguiente:

GtkButton::default_border={0,0,0,0}
GtkButton::default_outside_border={0,0,0,0}
GtkButtonBox::child_min_width=0
GtkButtonBox::child_min_heigth=0
GtkButtonBox::child_internal_pad_x=0
GtkButtonBox::child_internal_pad_y=0
GtkMenu::vertical-padding=1
GtkMenuBar::internal_padding=0
GtkMenuItem::horizontal_padding=4
GtkToolbar::internal-padding=0
GtkToolbar::space-size=0
GtkOptionMenu::indicator_size=0
GtkOptionMenu::indicator_spacing=0
GtkPaned::handle_size=4
GtkRange::trough_border=0
GtkRange::stepper_spacing=0
GtkScale::value_spacing=0
GtkScrolledWindow::scrollbar_spacing=0
GtkTreeView::vertical-separator=0
GtkTreeView::horizontal-separator=0
GtkTreeView::fixed-height-mode=TRUE
GtkWidget::focus_padding=0
}
class "GtkWidget" style "gtkcompact"

Como se puede ver, el cambio es evidente:

Actualización: He estado probando y para mi gusto se queda aún mejor con lo siguiente:
style "gtkcompact" {
GtkButton::default_border={0,0,0,0}
GtkButton::default_outside_border={0,0,0,0}
GtkButtonBox::child_min_width=0
GtkButtonBox::child_min_heigth=0
GtkButtonBox::child_internal_pad_x=0
GtkButtonBox::child_internal_pad_y=0
GtkMenu::vertical-padding=0
GtkMenuBar::internal_padding=0
GtkMenuItem::horizontal_padding=4
GtkToolbar::internal-padding=0
GtkToolbar::space-size=0
GtkOptionMenu::indicator_size=0
GtkOptionMenu::indicator_spacing=0
GtkPaned::handle_size=1
GtkRange::trough_border=0
GtkRange::stepper_spacing=0
GtkScale::value_spacing=0
GtkScrolledWindow::scrollbar_spacing=0
GtkTreeView::vertical-separator=0
GtkTreeView::horizontal-separator=0
GtkTreeView::fixed-height-mode=TRUE
GtkWidget::focus_padding=0
}

Presentación

En este blog iré recopilando pequeños trucos y tutoriales para tenerlos siempre a mano y que no se pierdan con el tiempo.