code: def gtfs_to_graphviz(gtfs, stop_ids=None):
      
      graph = GraphViz()
      location_ids = choose_location_ids(gtfs, stop_ids)
      locations = [gtfs.get_location(i) for i in location_ids]
  
      for location in locations:
          if not location.parent_id:
              graph.add_cluster(GraphCluster(
                  location.gtfs_id,
                  location_label(location, max_length=-1),
                  location_color(location.location_type)))
  
      for location in locations:
          if location.parent_id and requires_platform_cluster(location):
              graph.get_cluster(location.parent_id).add_cluster(GraphCluster(
                  location.gtfs_id,
                  location_label(location),
                  location_color(location.location_type)))
  
      for location in locations:
          if not location.parent_id or requires_platform_cluster(location):
              continue
          node = GraphNode(
              location.gtfs_id,
              location_label(location, max_length=25),
              location_color(location.location_type),
              location_shape(location.location_type))
          cluster = graph.get_cluster(location.station().gtfs_id)
          if location.location_type == LocationType.boarding_area:
              cluster = cluster.get_cluster(location.parent_id)
          cluster.nodes.append(node)
  
      for pathway in gtfs.pathways:
          if pathway.from_id in location_ids and pathway.to_id in location_ids:
              graph.edges.append(GraphEdge(
                  pathway.from_id, pathway.to_id,
                  'both' if pathway.is_bidirectional else 'forward',
                  pathway_label(pathway)))
  
      return graph
docs: Reads GTFS data and returns GraphViz DOT file content as string.