Plotting a line between a pair of y coordinates - python

I am trying to plot the following code where data1, data2, data3 are vectors.
data1 = np.array(means1)
print('data1=',data1)
data2 = np.array(ci_l)
print('data2',data2)
data3 = np.array(ci_h)
print('data3',data3)
x = data1
y = np.concatenate([data2[:,None],data3[:,None]], axis=1)
print('x=', x,'y=',y)
plt.plot(x, [i for (i,j) in y], 'rs', markersize = 4)
plt.plot(x, [j for (i,j) in y], 'bo', markersize = 4)
plt.show()
For each x points as you see in the code I have two y points. When I run the code I obtain the following output:
data1= [[22.8]
[31.6]
[27.4]
[30.4]
[30.6]]
data2 [[21.80474319]
[30.60474319]
[26.40474319]
[29.40474319]
[29.60474319]]
data3 [[23.79525681]
[32.59525681]
[28.39525681]
[31.39525681]
[31.59525681]]
x= [[22.8]
[31.6]
[27.4]
[30.4]
[30.6]] y= [[[21.80474319]
[23.79525681]]
[[30.60474319]
[32.59525681]]
[[26.40474319]
[28.39525681]]
[[29.40474319]
[31.39525681]]
[[29.60474319]
[31.59525681]]]
and this figure:
My question is how to plot a line that connect each y pair? My problem is similar to this:
< Matplotlib how to draw vertical line between two Y points >
I try to add the following line as suggested to the code:
plt.plot((x,x),([i for (i,j) in y], [j for (i,j) in y]),c='black')
but I obtain the following error:
Traceback (most recent call last):
File "/Users/oltiana/Desktop/datamining/chapter4.py", line 151, in <module>
plt.plot((x,x),([i for (i,j) in y], [j for (i,j) in y]),c='black')
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/pyplot.py", line 3019, in plot
return gca().plot(
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/axes/_axes.py", line 1605, in plot
lines = [*self._get_lines(*args, data=data, **kwargs)]
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/axes/_base.py", line 315, in __call__
yield from self._plot_args(this, kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/axes/_base.py", line 504, in _plot_args
raise ValueError(f"x and y can be no greater than 2D, but have "
ValueError: x and y can be no greater than 2D, but have shapes (2, 5, 1) and (2, 5, 1)
I try to solve the problem using shape and reshape bout still does not work. Any suggestion would be helpful for me. Thank you!

I notice that your arrays of data all look like two-dimensional lists - each number is the only element in a list of its own! ([[22.8], [31.6], ...] instead of [22.8, 31.6, ...])
That's why you're getting the shape error. There are a few ways to fix this, but one easy way is to call .flatten() on each array. This reduces it to be one-dimensional, and your code will work fine with data like that.
data1 = np.array(means1).flatten()
data2 = np.array(ci_l).flatten()
data3 = np.array(ci_h).flatten()
...

try writing
for x1,y1y2 in zip(x,y):
plt.plot([x1,x1],y1y2,'k-') #'k-' to prevent automatic coloring
BEFORE
plt.plot(x, [i for (i,j) in y], 'ro', markersize = 4)
plt.plot(x, [j for (i,j) in y], 'bs', markersize = 4)
This will make a two-point plot for each pair of points.
This will work visually, but may mess up automatic legends

Related

VALUE ERROR: x, y, and format string must not be None. (error while plotting hysteresis loop)

With the low cycle fatigue data, I'm trying to plot the Hysteresis loop. But I'm getting the following error:
[ -52.18297297 -45.58565338 16.9913185 ... -354.53630032 -295.50857248
-155.42088911]
[-0.01229182 -0.00891753 0.02256744 ... -0.33507242 -0.31283728
-0.24790212]
Traceback (most recent call last):
File "f:\I2M\LCF\Ep1_camp4_P4_TTH650 06-9-21 11 01 24\ep1_camp4_P4.py", line 16, in <module>
plt.plot(strain, Sigma, color = 'k')
File "C:\Users\DELL\AppData\Local\Programs\Python\Python39\lib\site-
packages\matplotlib\pyplot.py", line 2840, in plot
return gca().plot(
File "C:\Users\DELL\AppData\Local\Programs\Python\Python39\lib\site-
packages\matplotlib\axes\_axes.py", line 1743, in plot
lines = [*self._get_lines(*args, data=data, **kwargs)]
File "C:\Users\DELL\AppData\Local\Programs\Python\Python39\lib\site-
packages\matplotlib\axes\_base.py", line 273, in __call__
yield from self._plot_args(this, kwargs)
File "C:\Users\DELL\AppData\Local\Programs\Python\Python39\lib\site-
packages\matplotlib\axes\_base.py", line 379, in _plot_args
raise ValueError("x, y, and format string must not be None")
ValueError: x, y, and format string must not be None
And here is my code:
import matplotlib.pyplot as plt
import numpy as np
plt.style.use(['science','no-latex'])
x = np.loadtxt('F:\\I2M\\LCF\\Ep1_camp4_P4_TTH650 06-9-21 11 01 24\\data_1.csv',unpack = True,
skiprows = 2, usecols = 2, delimiter = ',')
y = np.loadtxt('F:\\I2M\\LCF\\Ep1_camp4_P4_TTH650 06-9-21 11 01 24\\data_1.csv',unpack = True,
skiprows = 2, usecols = 3, delimiter = ',')
stress = (x*1000)/28.27 #N/mm^2 = MPa
length = len(stress)
length = len(y)
plt.figure(figsize=(5, 5))
Sigma = print(stress[0:length:10]) #stress
strain = print(y[0:length:10])
plt.plot(strain, Sigma, color = 'k')
plt.show()
Data contains many rows. So I used some commands to access only particular values from the row
Your problem is here
Sigma = print(stress[0:length:10]) #stress
strain = print(y[0:length:10])
what you want plausibly is to sample every 10th data point, but what you get is … nothing or, from the point of view of Python: None, so that later your stack trace informs you that x, y, and format string must not be None.
Why this happens, and how you solve the problem?
When you make an assignment, the value of the expression on the right is saved and you can use the name on the left to use it later, so you save, e.g., the value returned by print(y[0:length:10]) to use it later under the name strain, but print() is used for its side effects (i.e., showing a bunch of characters on your terminal) and the value that is returned in these cases is by default None, not what was shown on your terminal.
If I have understood your intentions, you should omit the two lines above and just use
plt.plot(x[0:length:10], y[0:length:10], color='k')
A side note, you have
length = len(stress)
length = len(y)
but you read them from the same file, one assignment should be enough…
PS
x, y = np.loadtxt('…\\data_1.csv', unpack=1, skiprows=2, usecols=[2,3], delimiter=',')

python matplotlib scatter plot colors error

I am trying to create a scatter plot with x and y grid where every point gets a color by a preassigned value:
{x: 1, y: 2, value: n}
I have a list of x and y and another list for the values, tried using this:
# make range of x(0 - 359) and y(-90 - 90)
x, y = np.meshgrid(range(0, 360), range(-90, 90))
colors = [a very long list (64800 values, one for each point)]
print(colors)
plt.scatter(x, y, c=colors)
plt.colorbar()
plt.show()
Errors:
Traceback (most recent call last):
File "C:\python3.6.6\lib\site-packages\matplotlib\colors.py", line 158, in to_rgba
rgba = _colors_full_map.cache[c, alpha]
KeyError: (1.0986122886681098, None)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\python3.6.6\lib\site-packages\matplotlib\axes\_axes.py", line 4210, in scatter
colors = mcolors.to_rgba_array(c)
File "C:\python3.6.6\lib\site-packages\matplotlib\colors.py", line 259, in to_rgba_array
result[i] = to_rgba(cc, alpha)
File "C:\python3.6.6\lib\site-packages\matplotlib\colors.py", line 160, in to_rgba
rgba = _to_rgba_no_colorcycle(c, alpha)
File "C:\python3.6.6\lib\site-packages\matplotlib\colors.py", line 211, in _to_rgba_no_colorcycle
raise ValueError("Invalid RGBA argument: {!r}".format(orig_c))
ValueError: Invalid RGBA argument: 1.0986122886681098
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:/Users/amit neumark/Documents/עמית/alpha/grbs data/grbs/find_burst_location.py", line 168, in <module>
main()
File "C:/Users/amit neumark/Documents/עמית/alpha/grbs data/grbs/find_burst_location.py", line 161, in main
ra2, dec2 = chi_square(model, relations)
File "C:/Users/amit neumark/Documents/עמית/alpha/grbs data/grbs/find_burst_location.py", line 33, in chi_square
create_plot(sums)
File "C:/Users/amit neumark/Documents/עמית/alpha/grbs data/grbs/find_burst_location.py", line 134, in create_plot
plt.scatter(x, y, c=colors)
File "C:\python3.6.6\lib\site-packages\matplotlib\pyplot.py", line 2793, in scatter
verts=verts, edgecolors=edgecolors, data=data, **kwargs)
File "C:\python3.6.6\lib\site-packages\matplotlib\__init__.py", line 1785, in inner
return func(ax, *args, **kwargs)
File "C:\python3.6.6\lib\site-packages\matplotlib\axes\_axes.py", line 4223, in scatter
.format(nc=n_elem, xs=x.size, ys=y.size)
ValueError: 'c' argument has 64800 elements, which is not acceptable for use with 'x' with size 64800, 'y' with size 64800.
The problem is in your x and y data and not in the colors c parameter. Your x and y is currently a 2d array (meshgrid). It should be a list of positions. One way to do so is to flatten your 2d meshgrids to get a 1-d array. The one to one correspondence between x and y data points will be maintained. The meshgrids work normally for scatter 3d plots.
I am choosing some random colors to provide a solution.
x, y = np.meshgrid(range(0, 360), range(-90, 90))
colors = np.random.random(360*180)
plt.scatter(x.flatten(), y.flatten(), c=colors)
plt.colorbar()
It might make more sense to plot using something like imshow or pcolormesh. This creates a "heatmap" across a grid of x,y coordinates. The x,y meshgrid is optional for these functions.
colors = np.arange(64800)
plt.pcolormesh(colors.reshape(360, 180).T)
# OR #
x, y = np.meshgrid(range(0, 360), range(-90, 90))
plt.pcolormesh(x, y, colors.reshape(360, 180).T)
You should pay attention to how you reshape colors. You can fill either by rows or by columns. The default is by rows (last axis). This is also important to note in the other answer as you flatten your meshgrid.

Using Polyfit to create 3rd degree polynomial with dynamic CSV's

What the data look like although I may end up with more than just three columns:
TotalArea,Pressure,Intensity
12054.2,-0.067,39.579
11980.2,-0.061,41.011
11948,-0.055,42.08
11889.5,-0.04,45.732
11863.6,-0.03,50.573
My goal: I would like to take this CSV file and create A polynomial that will fit the column labeled Intensity and TotalArea.
My code (omitting anything I believe to be purely decorative):
Graph = pd.read_csv("C:Data.csv")
Pl = Graph.dropna()
Bottom = Pl["TotalArea"]
Right = Pl["Intensity"]
arr = Pl.values
x = Bottom
y2 = Right
fig = plt.figure()
ax1 = fig.add_subplot(1, 1, 1)
xx = arr[:, [0]]
b = xx.ravel()
print(b)
yy = arr[:, [2]]
c = xx.ravel()
y3 = np.polyfit(b, c, 3)
ax2 = ax1.twinx()
ax2.plot(x, y2, color = "r", label='Intensity /Area')
plt.show()
My error: (has to do with polyfit values)
Traceback (most recent call last):
File "/mnt/WinPartition/Users/tomchi/Documents/Programming/Eclipse/PythonDevFiles/so_test.py", line 47, in <module>
ax2.plot(x, y3)
File "/usr/local/lib/python3.5/dist-packages/matplotlib/__init__.py", line 1855, in inner
return func(ax, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/matplotlib/axes/_axes.py", line 1527, in plot
for line in self._get_lines(*args, **kwargs):
File "/usr/local/lib/python3.5/dist-packages/matplotlib/axes/_base.py", line 406, in _grab_next_args
for seg in self._plot_args(this, kwargs):
File "/usr/local/lib/python3.5/dist-packages/matplotlib/axes/_base.py", line 383, in _plot_args
x, y = self._xy_from_xy(x, y)
File "/usr/local/lib/python3.5/dist-packages/matplotlib/axes/_base.py", line 242, in _xy_from_xy
"have shapes {} and {}".format(x.shape, y.shape))
ValueError: x and y must have same first dimension, but have shapes (310,) and (2,)
So, my question is: What exactly does this mean? Is it due to pandas dataframe? Can I solve this in a quick manner? Can I be of any more assistance?
I realise now that polyfit just gives me the coefficients to my polynomial
[ -2.27230868e-23 2.74362531e-19 1.00000000e+00 -1.90568829e-12]

ValueError when using lmfit LognormalModel

I have been using lmfit for about a day now and needless to say I know very little about the library. I have been using several built-in models for curve fitting and all of them work flawlessly with the data except the Lognormal Model.
Here is my code:
from numpy import *
from lmfit.models import LognormalModel
import pandas as pd
import scipy.integrate as integrate
import matplotlib.pyplot as plt
data = pd.read_csv('./data.csv', delimiter = ",")
x = data.ix[:, 0]
y = data.ix[:, 1]
print (x)
print (y)
mod = LognormalModel()
pars = mod.guess(y, x=x)
out = mod.fit(y, pars , x=x)
print(out.best_values)
print(out.fit_report(min_correl=0.25))
out.plot()
plt.plot(x, y, 'bo')
plt.plot(x, out.init_fit, 'k--')
plt.plot(x, out.best_fit, 'r-')
plt.show()
and the error output is:
Traceback (most recent call last):
File "Cs_curve_fit.py", line 17, in <module>
pvout = pvmod.fit(y, amplitude= 1, center = 1, sigma =1 , x=x)
File "C:\Users\NAME\Anaconda3\lib\site-packages\lmfit\model.py", line 731, in fit
output.fit(data=data, weights=weights)
File "C:\Users\NAME\Anaconda3\lib\site-packages\lmfit\model.py", line 944, in fit
self.init_fit = self.model.eval(params=self.params, **self.userkws)
File "C:\Users\NAME\Anaconda3\lib\site-packages\lmfit\model.py", line 569, in eval
return self.func(**self.make_funcargs(params, kwargs))
File "C:\Users\NAME\Anaconda3\lib\site-packages\lmfit\lineshapes.py", line 162, in lognormal
x[where(x <= 1.e-19)] = 1.e-19
File "C:\Users\NAME\Anaconda3\lib\site-packages\pandas\core\series.py", line 773, in __setitem__
setitem(key, value)
File "C:\Users\NAME\Anaconda3\lib\site-packages\pandas\core\series.py", line 755, in setitem
raise ValueError("Can only tuple-index with a MultiIndex")
ValueError: Can only tuple-index with a MultiIndex
First, the error message you show cannot have come from the code you post. The error message says that line 17 of the file "Cs_curve_fit.py" reads
pvout = pvmod.fit(y, amplitude= 1, center = 1, sigma =1 , x=x)
but that is not anywhere in your code. Please post the actual code and the actual output.
Second, the problem appears to happening because the data for x is cannot be turned into a 1D numpy array. Not being able to trust your code or output, I would just suggest converting the data to 1D numpy arrays yourself as a first test. Lmfit should be able to handle Pandas series, but it just does a simple coercion to 1D numpy arrays.

matplotlib.pyplot.pcolor message of mismatch error: an L is missing

I often use pcolor method of matplotlib but it sometimes gives me something like a dimension mismatch error that I don't understand. Here a sample code
import numpy as np
import matplotlib.pyplot as plt
idx1 = 180
idx2 = 220
Range1 = range(idx1, idx2, 1)
Range2 = range(512)
z = np.random.randn( len( Range1 ), 512)
x, y = np.meshgrid( Range1 , Range2)
plt.figure()
plt.pcolor(x, y, z)
plt.show()
As you can try by yourself the mismatch error is
Traceback (most recent call last):
File "<ipython-input-1-7d51fd1b710e>", line 13, in <module>
plt.pcolor(x, y, z)
File "C:\Users\fedel\Anaconda2c\lib\site-packages\matplotlib\pyplot.py", line 3083, in pcolor
ret = ax.pcolor(*args, **kwargs)
File "C:\Users\fedel\Anaconda2c\lib\site-packages\matplotlib\__init__.py", line 1818, in inner
return func(ax, *args, **kwargs)
File "C:\Users\fedel\Anaconda2c\lib\site-packages\matplotlib\axes\_axes.py", line 5168, in pcolor
X, Y, C = self._pcolorargs('pcolor', *args, allmatch=False)
File "C:\Users\fedel\Anaconda2c\lib\site-packages\matplotlib\axes\_axes.py", line 4996, in _pcolorargs
C.shape, Nx, Ny, funcname))
TypeError: Dimensions of C (40L, 512L) are incompatible with X (40) and/or Y (512); see help(pcolor)
What is the difference between a "40L" dimension and a "40" without L dimension? And what do you suggest me to do in order to avoid this error and plot the data?
The L is not the issue. That's an artifact of using an old Python version (Python 2 has two integer types).
It looks like your z (C to the pcolor method) has a transposed shape, 40 × 512 instead of 512 × 40:
for a in [x, y, z]:
print(a.shape)
# (512, 40)
# (512, 40)
# (40, 512)
Transposing z makes it work: plt.pcolor(x, y, z.T)

Categories