Untitled

 avatar
unknown
python
a year ago
2.5 kB
6
Indexable
import numpy as np
import matplotlib.pyplot as plt

def makedatatip(hObj, index):
    def create_datatip(h_data_cursor_mgr, h_obj):
        return h_data_cursor_mgr.create_artists(h_obj)

    def update_data_cursors(h_data_cursor_mgr):
        h_data_cursor_mgr.update()

    if len(hObj) != 1:
        raise ValueError('HOBJ must be scalar.')
    if not plt.gca().findobj(hObj):
        raise ValueError('HOBJ is an invalid handle object.')

    is_image = hObj[0].get_type() == 'image'  # Determine if target is image

    try:
        X = hObj[0].get_xdata()
        Y = hObj[0].get_ydata()
        Z = hObj[0].get_zdata()
    except Exception as e:
        # Object must have an XData and YData property to be valid
        raise ValueError(f'Objects of class {type(hObj)} are not a valid targets for datatips.') from e

    if not index:
        return

    if not isinstance(index, np.ndarray) or index.dtype != 'int' or np.any(index < 1) or np.any(np.floor(index) != index) or np.any(np.isinf(index)):
        raise ValueError('Subscript indices must be positive integers.')

    if np.ndim(index) == 1 or (np.ndim(index) == 2 and np.size(index, 1) == 2):
        h_datatip = [None] * len(index)
        index = np.ravel(index)
        is_linear = True
    else:
        h_datatip = [None] * np.size(index, 0)
        is_linear = False

    h_data_cursor_mgr = plt.get_current_fig_manager().datacursor
    for n in range(len(index)):
        if is_image and is_linear:
            i, j = np.unravel_index(index[n], (X.shape[0], Y.shape[0]))
            pos = [i, j, 1]
        elif is_image:
            pos = [index[n, 0], index[n, 1], 1]
        elif Z is None:
            pos = [X[index[n]], Y[index[n]]]
        elif is_linear:
            pos = [X[index[n]], Y[index[n]], Z[index[n]]]
        else:
            pos = [X[index[n, 0], index[n, 1]], Y[index[n, 0], index[n, 1]], Z[index[n, 0], index[n, 1]]]

        h_datatip[n] = create_datatip(h_data_cursor_mgr, hObj[0])
        if is_image:
            h_datatip[n].data = {'index': pos, 'position': pos[:2]}
        else:
            h_datatip[n].data = {'index': index[n], 'position': pos}

        h_datatip[n].position = pos

    update_data_cursors(h_data_cursor_mgr)

    return h_datatip

# Example usage
x = np.arange(1, 11)
y = np.random.rand(10)
hPlot, = plt.plot(x, y)
makedatatip([hPlot], np.array([[3, 8]]))
plt.show()
Editor is loading...
Leave a Comment