Hi,

Is the current is constant over time? If not this becomes a harder problem 
but not impossible -- you'd need to integrate the current curve to compute 
the capacity labels.

I'm not sure if this is the best way to do it, but I made a dual axis for a 
project (left/right wavelength and frequency axes) by copying/extending 
AxisItem like this:

class AxisItemScaleFunction(pg.AxisItem):
    """Extension of pyqtgraph AxisItem which allows the axis tick labels to 
be
    transformed using a user-specified function.

    Typical use would be to display the same axis data in two different unit
    systems. For example, temperature in C and F, or light wavelength as 
well as
    photon energy.

    Note that the axis range and scale is not changed, only the calculation 
of
    the axis tick labels."""

    def __init__(self, orientation, pen=None, linkView=None, parent=None, 
maxTickLength=-5, showValues=True, scalefunc=lambda x: x):
        self.scalefunc = scalefunc
        pg.AxisItem.__init__(self, orientation, pen=pen, linkView=linkView, 
parent=parent, maxTickLength=maxTickLength, showValues=showValues)

    def tickStrings(self, values, scale, spacing):
        if self.logMode:
            return self.logTickStrings(values, scale, spacing)

        warnings.simplefilter("ignore")
        try:
            places = np.nanmax([0,
                np.ceil(-np.log10((np.abs(self.scalefunc(values[0] + spacing
) - self.scalefunc(values[0])))*scale)),
                np.ceil(-np.log10((np.abs(self.scalefunc(values[-1]) - self.
scalefunc(values[-1] - spacing)))*scale))])
        except IndexError:
            places = 0
        warnings.simplefilter("default")
        strings = []
        for v in values:
            vs = self.scalefunc(v) * scale
            if abs(vs) < .001 or abs(vs) >= 10000:
                vstr = "%g" % vs
            else:
                vstr = ("%%0.%df" % places) % vs
            strings.append(vstr)
        return strings

    def updateAutoSIPrefix(self):
        if self.label.isVisible():
            (scale, prefix) = pg.siScale(max(abs(self.scalefunc(self.range[0
])), abs(self.scalefunc(self.range[1]))))
            if self.labelUnits == '' and prefix in ['k', 'm']:  ## If we 
are not showing units, wait until 1e6 before scaling.
                scale = 1.0
                prefix = ''
            self.setLabel(unitPrefix=prefix)
        else:
            scale = 1.0

        self.autoSIPrefixScale = scale
        self.picture = None
        self.update()

    def logTickStrings(self, values, scale, spacing):
        return ["%0.1g"%x for x in 10 ** np.array(self.scalefunc(values)).
astype(float)]

In its init method it takes a reference to a function which is used to 
compute the alternate tick labels. You then manually assign this custom 
axis item to the plot when you create it, something like:

rax = AxisItemScaleFunction(orientation='right', scalefunc=lambda x: 1e-3*
constants.c/x if not x == 0 else np.inf)
self.spectrum = self.overview_graphicsLayoutWidget.addPlot(axisItems={
'right': rax})
self.spectrum.setLabels(left="Frequency (THz)", bottom="Intensity (a.u.)", 
right="Wavelength (nm)")
self.spectrum_plot = self.spectrum.plot(pen=(255, 255, 0), name="Spectrum")

So if your current is constant, just sub your formula into the lambda 
function above. If not, then you will probably want to create a full 
function that integrates the current given a time t, and use 
scalefunc=compute_capacity instead.

Hope that helps,
Patrick


On Thursday, 7 February 2019 21:41:24 UTC+10:30, [email protected] 
wrote:
>
> BTW I forgot to mention I don't want to plot new curve, I just want one 
> curve and 2 x-axes whose values are corresponds to each other
>
> W dniu czwartek, 7 lutego 2019 11:44:34 UTC+1 użytkownik 
> [email protected] napisał:
>>
>> Hello. I have a program which gathers measurements of voltage, current 
>> and time. I'd like to create a plot Voltage vs time and second X-axis at 
>> top with Capacity on it. I've done simple window like this:
>>
>> import pyqtgraph as pg
>>
>> win=pg.GraphicsWindow("plot")
>> win.resize(1000,600)
>> plt=win.addPlot(row = 1, col = 0,title="Plot",labels={'left': 'Voltage 
>> [V]','bottom': 'time [s]','top': 'Capacity [mAh]'})
>> curve=plt.plot(pen='b')
>> label_cords = pg.LabelItem(justify = "right")
>> So it looks like on screen attached.
>>
>> In my measurements I also get current so Capacity is calculated as: 
>> current*10*time/36 (It's the same time I use to plot bottom x axis).
>>
>> How can I set values of top axis to show capacity corresponded to the 
>> time on bottom axis? 
>>
>> I've tried to work with one of 
>>
>> plt.getAxis('top').setTickSpacing()
>>
>> plt.getAxis('top').setTicks()
>>
>> plt.getAxis('top').tickValues()
>>
>>
>>
>> but I don't really know how to set it properly. I want to keep autorange 
>> function active (so when time axis going wider I want my Capacity axis to 
>> expand aswell)
>>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"pyqtgraph" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pyqtgraph/82f6b6e7-77b0-44a5-8c91-f9c2db74ecb0%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to