Matplotlib graph axis changing [duplicate] - matplotlib

This question already has answers here:
matplotlib generating strange y-axis on certain data sets?
(1 answer)
How to prevent numbers being changed to exponential form in a plot
(6 answers)
Matplotlib yaxis range display using absolute values rather than offset values?
(3 answers)
How can I change plt.plot x axis from 0 to real value?
(1 answer)
matplotlib axis label format
(2 answers)
Closed 1 year ago.
I am trying to make graph using pandas and matplotlib. My data in x and y axis is as follows
Data in X ( It is a python list)
[99.50133729728567,
99.32177485513289,
99.29662080782298,
99.1922871744391,
99.14070177652418,
99.29499371273404,
99.54826208274174,
99.85501632675789,
99.98246755801047,
100.28450605132474,
100.69047659277543,
100.82812684703163,
100.67670430280266,
100.39417022400526,
100.22792692751301,
99.9158443902431,
99.55075159185297,
99.330916993794,
99.37737347787801,
99.62973414137957,
100.01866583740237,
100.42758798072411,
100.56199275721731,
100.48335938102836,
100.313649654463,
100.16496347602485,
99.82351418830224,
99.46621756385987,
99.33208175544729,
99.2794271217398,
99.42925472046936,
99.52825492237166,
99.7573717856461,
99.96122191358516,
100.1013977818942,
100.26595437442364]
Data in Y ( It is a python list)
[100.00020398087408,
100.00043468828244,
100.00050028851648,
100.00030297162272,
99.9997920462273,
99.99883929230562,
99.99906856654064,
99.99950793983656,
99.9986149630411,
99.9982943411356,
99.99939115721274,
100.00021418167366,
100.0008698442229,
100.00061513516697,
100.00129114064856,
100.00151549197089,
100.00027715439002,
100.00023658939669,
99.99899872492574,
99.99747708221712,
99.99758605940052,
99.9990886473757,
100.00046810814177,
100.00045794761733,
100.00090169642483,
100.00184415283576,
100.0021535400512,
100.00079677558163,
100.0005244158289,
99.99967151341512,
100.00009168515908,
99.99958972419704,
99.99920652259239,
99.99939034471534,
99.99908335764445,
100.00043148740218]
I am using following code to make the graph
plt.plot(ss['x'].iloc[0:n], ss['y'].iloc[0:n], linestyle="-", marker='>', label=sector)
plt.legend()
plt.show()
The graph shows like this:
I want to achieve the following:
The x axis seems fine, with scale around 100. But y axis changes the scale on its own as can be seen in the image. While actual y data is of the order of magnitude around 100, the graph has order of magnitude .0011. I am not sure why this change on its own and how to correct it and get around 100.

To find out the range of your Y values you can do this:
print(min(Y), max(Y))
This gives:
99.99747708221712 100.0021535400512
The distance from min(Y) to max(Y) is only 0.0046. That is why matplotlib has plotted the Y axis as a range (-0.002 to +0.002) + an offset of '1e2', which is shown at the top left. '1e2' means "1 x 10 to the power of 2", i.e. 100. Therefore the y-axis range is correct: 99.998 to 100.002.
My guess is, that it shows the labels as -0.002, -0.001, 0.000, ... etc. +1e2 because they are easier to read than 99.998, 99.999, 100.000, ... etc.
UPDATE:
I looked in the documentation and there is a command for setting the tick label behaviour. Use this setting to turn off the behaviour above:
plt.ticklabel_format(axis='y', useOffset=False)
Then the labels are 'normal':

Related

How to connect points with different indices (one data file) in gnuplot

I have a file "a_test.dat" with two data blocks that I can select via the corresponding index.
# first
x1 y1
3 1
6 2
9 8
# second
x2 y2
4 5
8 2
2 7
Now I want to connect the data points of both indices with an arrow.
set arrow from (x1,y1) to (x2,y2).
I can plot both blocks with one plot statement. But I cannot get the points to set the arrows.
plot "a_test.dat" index "first" u 1:2, "" index "second" u 1:2
From version 5.2 you can use gnuplot arrays:
stats "a_test.dat" nooutput
array xx[STATS_records]
array yy[STATS_records]
# save all data into two arrays
i = 1
fnset(x,y) = (xx[i]=x, yy[i]=y, i=i+1)
# parse data ignoring output
set table $dummy
plot "" using (fnset($1,$2)) with table
unset table
# x2,y2 data starts at midpoint in array
numi = int((i-1)/2)
plot for [i=1:numi] $dummy using (xx[i]):(yy[i]):(xx[numi+i]-xx[i]):(yy[numi+i]-yy[i]) with vectors
Use stats to count the number of lines in the file, so that the array can
be large enough. Create an array xx and another yy to hold the data.
Use plot ... with table to read the file again, calling your function
fnset() for each data line with the x and y column values. The function
saves them at the current index i, which it increments. It was
initialised to 1.
For 3+3 data lines, i ends up at 7, so we set numi to (i-1)/2 i.e. 3.
Use plot for ... vectors to draw the arrows. Each arrow needs 4 data
items from the array. Note that the second x,y must be a relative delta,
not an absolute position.

How to set in range in hexbin plots pandas?

I want to set range of y-axis in the following code.My values are [19,20,21,22,23,24.....,40].I want the labels to be starting from of difference 10,starting from 10 upto 40.How should I set that.
I was trying to use x-lim but it is not working.
plt.hexbin(p_df['Age'], p_df['Salary'], gridsize = 50,bins ='log',cmap ='BuGn',xlim =(19, 40))
To set the range of values to include in the binning, you must use the 'extent' keyword. So to have a hexbin plot with a range between your desired x and y values, you can use,
extent=[-x,x,10,40]
where x is your included x coordinates.
So your new code would be
plt.hexbin(p_df['Age'], p_df['Salary'], gridsize = 50,bins ='log', extent=[-x,x,10,40],cmap ='BuGn')

VB2010 Setting logarithmic scale intervals

I'm developing a financial application in which I need to display data in a chart with a logarithmic scale on the Y axis. Everything works fine except for the intervals. With the following:
chart.ChartAreas(0).AxisY.IsLogarithmic = True
chart.ChartAreas(0).AxisY.LogarithmBase = 10
chart.ChartAreas(0).AxisY.Interval = 1
chart.ChartAreas(0).AxisY.Minimum = CalcMinYVal(minYVal)
I get the CalcMinYVal multiplied by 10^0,10^1,10^2,10^3 and so on for the Y-axis values.
I would like to have the Y axis values increased by 1. How can I have the interval be REALLY 1?
You can enable the MinorGrid property
chart.ChartAreas(0).AxisY.MinorGrid = True
to show the horizontal lines in between the powers of 10 like shown below.
But there is a limitation in showing the value for each subdivision. They can only appear in fixed intervals by using the Interval property of the LabelStyle.
For example to show 10 subdivisions, you can set:
Chart.ChartAreas(0).AxisY.LabelStyle.Interval = 0.1
The number of the horizontal lines of the MinorGrid can be controlled by using its Interval propery:
Chart.ChartAreas(0).AxisY.MinorGrid.Interval = 1
and the values of the labels can be rounded by using the format property:
Chart.ChartAreas(0).AxisY.LabelStyle.Format = "{0.0}"

Bar and Line charts are not synced when in the same chart area

I have problem with a chart in vb.net. The problem is that line and bar are not synced in the chart area. I've attached a picture to make it clear what I mean
Here is the code where I populate the chart. I´m getting the data from a database.
Dim theDate As Date
For i As Integer = Count - 1 To 0 Step -1
'Chart1.Series("serRxTime").Points.AddY(dv(i)(0) / 60)
theDate = dv(i)(1)
Chart1.Series("serTime").Points.AddXY(theDate.ToString("dd-MMM HH:MM", enUS), dv(i)(0) / 60)
Chart1.Series("serAdd").Points.AddY(dv(i)(2))
Next
Line and column series have the same XValues that's why their centres are aligned. You would need to generate different XValues for the two series. XValues that are offset by a small margin. Something like this:
Chart1.Series("serTime").XValues = {0.8, 1.8, 2.8, 3.8,,...,count - 0.2}
Chart1.Series("serAdd").XValues = {1, 2, 3, 4,..., count}
I used 0.2 difference, but this will be different in your case (especially since it seems you have date axis set?). This would push the line series to the left.
I created an example for you. On the first picture you can see the data for the columns. Their x values are 1,2,3,4,...,12 and their y values are marked with blue.
And this is the values for the XY chart. As you can see I moved the x values by 0.2 to the left.

GNUPLOT: dot plot with data depending dot size

I am trying plot data sets consisting of 3 coordinates:
X-coordinate, x-coordinate and the number of occurrences.
example:
1 2 10
3 1 2
3 2 1
I would like to draw for every line a dot at x,y with a diameter which is depending on the third value.
Is that possible with Gnuplot?
Create a 2D plot with variable point size. See the demo.
Example:
plot 'dataFile.dat' u 1:2:3 w points lt 1 pt 10 ps variable
This is basically equivalent to the existing answer, just shorter:
plot 'dataFile.dat' with circles
Credit: Gnuplot: plot with circles of a defined radius