# AlphaFrequency

VTKExamples/Python/Visualization/AlphaFrequency

### Code

AlphaFrequency.py

    #!/usr/bin/env python

    import re
    from collections import Counter

    import vtk

    def main():
        fileName = get_program_parameters()

        colors = vtk.vtkNamedColors()

        # Here we read the file keeping only the alpha characters
        #  and calculate the frequency of each letter.
        with open(fileName) as f:
            freq = Counter()
            for x in f:
                remove_digits = re.sub("[\d_]", "", x.strip().lower())
                freq += Counter(re.findall("\w", remove_digits, re.UNICODE))
        maxFreq = max(list(freq.values()))
        keys = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ".lower())

        #
        # graphics stuff
        #
        ren = vtk.vtkRenderer()
        renWin = vtk.vtkRenderWindow()
        renWin.AddRenderer(ren)
        iren = vtk.vtkRenderWindowInteractor()
        iren.SetRenderWindow(renWin)
        #
        # Setup letters
        #
        letters = list()
        extrude = list()
        mappers = list()
        actors = list()
        i = 0
        for k in keys:
            letters.append(vtk.vtkVectorText())
            letters[i].SetText(k.upper())

            extrude.append(vtk.vtkLinearExtrusionFilter())
            extrude[i].SetInputConnection(letters[i].GetOutputPort())
            extrude[i].SetExtrusionTypeToVectorExtrusion()
            extrude[i].SetVector(0, 0, 1.0)
            extrude[i].SetScaleFactor(float(freq[k]) / maxFreq * 2.50)

            mappers.append(vtk.vtkPolyDataMapper())
            mappers[i].SetInputConnection(extrude[i].GetOutputPort())
            mappers[i].ScalarVisibilityOff()

            actors.append(vtk.vtkActor())
            actors[i].SetMapper(mappers[i])
            actors[i].GetProperty().SetColor(colors.GetColor3d("Peacock"))

            if freq[k] <= 0:
                actors[i].VisibilityOff()
            ren.AddActor(actors[i])
            i += 1

        # Position the actors.
        y = 0.0
        for j in range(0, 2):
            x = 0.0
            for i in range(0, 13):
                actors[j * 13 + i].SetPosition(x, y, 0.0)
                x += 1.5
            y += -3.0

        ren.ResetCamera()
        ren.SetBackground(colors.GetColor3d("Silver"))
        ren.GetActiveCamera().Elevation(30.0)
        ren.GetActiveCamera().Azimuth(-30.0)
        ren.GetActiveCamera().Dolly(1.25)
        ren.ResetCameraClippingRange()

        renWin.SetSize(640, 480)

        # Interact with the data.
        iren.Start()

    def get_program_parameters():
        import argparse
        description = 'Linearly extruded fonts to show letter frequency in text.'
        epilogue = '''
        Any file containing text can be used.
        '''
        parser = argparse.ArgumentParser(description=description, epilog=epilogue,
                                         formatter_class=argparse.RawDescriptionHelpFormatter)
        parser.add_argument('filename', help='Gettysburg.txt.')
        args = parser.parse_args()
        return args.filename

    if __name__ == '__main__':
        main()