def create_valve_collection(net, valves=None, size=5., junction_geodata=None, color='k', infofunc=None, picker=False, fill_closed=True, respect_valves=False, **kwargs): """ Creates a matplotlib patch collection of pandapipes junction-junction valves. Valves are plotted in the center between two junctions with a "helper" line (dashed and thin) being drawn between the junctions as well. :param net: The pandapipes network :type net: pandapipesNet :param valves: The valves for which the collections are created. If None, all valves which have\ entries in the respective junction geodata will be plotted. :type valves: list, default None :param size: Patch size :type size: float, default 5. :param junction_geodata: Coordinates to use for plotting. If None, net["junction_geodata"] is used. :type junction_geodata: pandas.DataFrame, default None :param colors: Color or list of colors for every valve :type colors: iterable, float, default None :param infofunc: infofunction for the patch element :type infofunc: function, default None :param picker: Picker argument passed to the patch collection :type picker: bool, default False :param fill_closed: If True, valves with parameter opened == False will be filled and those\ with opened == True will have a white facecolor. Vice versa if False. :type fill_closed: bool, default True :param kwargs: Keyword arguments are passed to the patch function :return: lc - line collection, pc - patch collection """ valves = get_index_array( valves, net.valve[net.valve.opened.values].index if respect_valves else net.valve.index) valve_table = net.valve.loc[valves] coords, valves_with_geo = coords_from_node_geodata( valves, valve_table.from_junction.values, valve_table.to_junction.values, junction_geodata if junction_geodata is not None else net["junction_geodata"], "valve", "Junction") if len(valves_with_geo) == 0: return None linewidths = kwargs.pop("linewidths", 2.) linewidths = kwargs.pop("linewidth", linewidths) linewidths = kwargs.pop("lw", linewidths) infos = list(np.repeat([infofunc(i) for i in range(len(valves_with_geo))], 2)) \ if infofunc is not None else [] filled = valve_table["opened"].values if fill_closed: filled = ~filled lc, pc = _create_complex_branch_collection(coords, valve_patches, size, infos, picker=picker, linewidths=linewidths, filled=filled, patch_facecolor=color, line_color=color, **kwargs) return lc, pc
def create_heat_exchanger_collection(net, heat_ex=None, size=5., junction_geodata=None, infofunc=None, picker=False, **kwargs): """ Creates a matplotlib patch collection of pandapipes junction-junction heat_exchangers. Heat_exchangers are plotted in the center between two junctions with a "helper" line (dashed and thin) being drawn between the junctions as well. :param net: The pandapipes network :type net: pandapipesNet :param size: Patch size :type size: float, default 2. :param helper_line_style: Line style of the "helper" line being plotted between two junctions connected by a junction-junction heat_exchanger :type helper_line_style: str, default ":" :param helper_line_size: Line width of the "helper" line being plotted between two junctions connected by a junction-junction heat_exchanger :type helper_line_size: float, default 1. :param helper_line_color: Line color of the "helper" line being plotted between two junctions connected by a junction-junction valve :type helper_line_color: str, default "gray" :param orientation: Orientation of heat_exchanger collection. pi is directed downwards, increasing values lead to clockwise direction changes. :type orientation: float, default np.pi/2 :param kwargs: Keyword arguments are passed to the patch function :return: heat_exchanger, helper_lines :rtype: tuple of patch collections """ heat_ex = get_index_array(heat_ex, net.heat_exchanger.index) hex_table = net.heat_exchanger.loc[heat_ex] coords, hex_with_geo = coords_from_node_geodata( heat_ex, hex_table.from_junction.values, hex_table.to_junction.values, junction_geodata if junction_geodata is not None else net["junction_geodata"], "heat_exchanger", "Junction") if len(hex_with_geo) == 0: return None colors = kwargs.pop("color", "k") linewidths = kwargs.pop("linewidths", 2.) linewidths = kwargs.pop("linewidth", linewidths) linewidths = kwargs.pop("lw", linewidths) patch_edgecolor = kwargs.pop("patch_edgecolor", colors) line_color = kwargs.pop("line_color", colors) infos = list(np.repeat([infofunc(i) for i in range(len(hex_with_geo))], 2)) \ if infofunc is not None else [] lc, pc = _create_complex_branch_collection( coords, heat_exchanger_patches, size, infos, picker=picker, linewidths=linewidths, patch_edgecolor=patch_edgecolor, line_color=line_color, **kwargs) return lc, pc
def create_pump_collection(net, pumps=None, table_name='pump', size=5., junction_geodata=None, infofunc=None, picker=False, **kwargs): """ Creates a matplotlib patch collection of pandapipes junction-junction valves. Valves are plotted in the center between two junctions with a "helper" line (dashed and thin) being drawn between the junctions as well. :param net: The pandapipes network :type net: pandapipesNet :param pumps: The pumps for which the collections are created. If None, all pumps which have\ entries in the respective junction geodata will be plotted. :type pumps: list, default None :param table_name: Name of the pump table from which to get the data. :type table_name: str, default 'pump' :param size: Patch size :type size: float, default 5. :param junction_geodata: Coordinates to use for plotting. If None, net["junction_geodata"] is used. :type junction_geodata: pandas.DataFrame, default None :param infofunc: infofunction for the patch element :type infofunc: function, default None :param picker: Picker argument passed to the patch collection :type picker: bool, default False :param kwargs: Keyword arguments are passed to the patch function :return: lc - line collection, pc - patch collection """ pumps = get_index_array(pumps, net[table_name].index) pump_table = net[table_name].loc[pumps] coords, pumps_with_geo = coords_from_node_geodata( pumps, pump_table.from_junction.values, pump_table.to_junction.values, junction_geodata if junction_geodata is not None else net["junction_geodata"], "pump", "Junction") if len(pumps_with_geo) == 0: return None colors = kwargs.pop("color", "k") linewidths = kwargs.pop("linewidths", 2.) linewidths = kwargs.pop("linewidth", linewidths) linewidths = kwargs.pop("lw", linewidths) patch_edgecolor = kwargs.pop("patch_edgecolor", colors) line_color = kwargs.pop("line_color", colors) infos = list(np.repeat([infofunc(i) for i in range(len(pumps_with_geo))], 2)) \ if infofunc is not None else [] lc, pc = _create_complex_branch_collection( coords, pump_patches, size, infos, picker=picker, linewidths=linewidths, patch_edgecolor=patch_edgecolor, line_color=line_color, **kwargs) return lc, pc
def create_pipe_collection(net, pipes=None, pipe_geodata=None, junction_geodata=None, use_junction_geodata=False, infofunc=None, cmap=None, norm=None, picker=False, z=None, cbar_title="Pipe Loading [%]", clim=None, **kwargs): """ Creates a matplotlib pipe collection of pandapipes pipes. :param net: The pandapipes network :type net: pandapipesNet :param pipes: The pipes for which the collections are created. If None, all pipes in the network are considered. :type pipes: list, default None :param pipe_geodata: Coordinates to use for plotting. If None, net["pipe_geodata"] is used. :type pipe_geodata: pandas.DataFrame, default None :param junction_geodata: Coordinates to use for plotting in case of use_junction_geodata=True.\ If None, net["junction_geodata"] is used. :type junction_geodata: pandas.DataFrame, default None :param use_junction_geodata: Defines whether junction or pipe geodata are used. :type use_junction_geodata: bool, default False :param infofunc: infofunction for the line element :type infofunc: function, default None :param cmap: colormap for the line colors :type cmap: matplotlib norm object, default None :param norm: matplotlib norm object :type norm: matplotlib norm object, default None :param picker: Picker argument passed to the patch collection :type picker: bool, default False :param z: Array of pipe loading magnitudes for colormap. Used in case of given cmap. If None,\ net.res_pipe.loading_percent is used. :type z: array, default None :param cbar_title: colormap bar title in case of given cmap :type cbar_title: str, default "Pipe Loading [%]" :param clim: Setting the norm limits for image scaling :type clim: tuple of floats, default None :param kwargs: Keyword arguments are passed to the patch function and the patch maker :return: lc (matplotlib line collection) - line collection for pipes """ if use_junction_geodata is False and net.pipe_geodata.empty: # if bus geodata is available, but no line geodata logger.warning("use_junction_geodata is automatically set to True, since net.pipe_geodata " "is empty.") use_junction_geodata = True pipes = get_index_array(pipes, net.pipe.index) if len(pipes) == 0: return None if use_junction_geodata: coords, pipes_with_geo = coords_from_node_geodata( pipes, net.pipe.from_junction.loc[pipes].values, net.pipe.to_junction.loc[pipes].values, junction_geodata if junction_geodata is not None else net["junction_geodata"], "pipe", "Junction") else: if pipe_geodata is None: pipe_geodata = net.pipe_geodata pipes_with_geo = pipes[np.isin(pipes, pipe_geodata.index.values)] coords = list(pipe_geodata.loc[pipes_with_geo, "coords"]) pipes_without_geo = set(pipes) - set(pipes_with_geo) if pipes_without_geo: logger.warning("Could not plot pipes %s. Pipe geodata is missing for those pipes!" % pipes_without_geo) if len(pipes_with_geo) == 0: return None infos = [infofunc(pipe) for pipe in pipes_with_geo] if infofunc else [] lc = _create_line2d_collection(coords, pipes_with_geo, infos=infos, picker=picker, **kwargs) if cmap is not None: if z is None: z = net.res_pipe.v_mean_m_per_s.loc[pipes_with_geo] elif isinstance(z, pd.Series): z = z.loc[pipes_with_geo] add_cmap_to_collection(lc, cmap, norm, z, cbar_title, clim=clim) return lc