Skip to main content

plotting - How to 2D-plot function in two varibles


I try to make a plot of a function in multi variables as in that paper arXiv:1312.1935, FIG. 2 .


Mathematica graphics


I tried some thing like:


k[s_,f_] = s + f;

ListPlot[Table[k[s, f], {s, -1, 1, 0.5}, {f, -1, 1, 0.5}]]

But it plotted k[s, f] on the y- axis. While I'd like to have s and f on the x and y axises.



There is also ContourPlot, or PlotRegion, but to my knowledge the function k[s,f] will be plotted as continuous regions, while i'd like to present it as points (with known values like in the FIG).


So any help ?




" If the data is 3D and the third entry is obtained by applying a function like k[s,f] to the first two entries (like data set dt3d below), then the function we use to style the data is slightly different:"


Actually I don't understand from here. I understand in the example of td and styleddt that in Style[{##} and k[##], that ## refers to the two variables which k is function of them.


But now I try to plot another function, like Y[s,f,d]= s+f+d;, with -1 < s < 1, f= 0.5, and -0.5 < d < 0.5, and I want to plot Y[s,f,d] only at -2 < Y < 0, or we can use Piecewise as before to know Y values.



Answer



Update: I guess you want to color a list of 2D points using a function like k[s,f]. You can Style the original data and use the resulting data with ListPlot to get something like Figure 2 in the linked paper.


dt = RandomReal[{-1, 1}, {1000, 2}];


The first 10 rows of dt:


TableForm[dt[[;; 10]], TableHeadings -> {None, {"s", "f"}}]

Mathematica graphics


styleddt = Style[{##}, PointSize[.02],
Piecewise[{{Orange, -1 <= k[##] <= 0}, {Green, .5 <= k[##] <= .9},
{Red, 1.2 <= k[##] <= 1.6}}, Blue]] & @@@ dt;
labels = {"-1<=k[s,f]<=0", ".5<=k[s,f]<=.9", "1.2<=k[s,f]<=1.6", "otherwise"};
colors = {Orange, Green, Red, Blue};
legend = Row[Style[##, "Panel", 18] & @@@ Transpose[{labels, colors}], Spacer[5]];


ListPlot[styleddt, DataRange -> {{-1, 1}, {-1, 1}}, Frame -> True,
ImageSize -> 500, AspectRatio -> 1, PlotLabel -> legend]

Mathematica graphics


If the data is 3D and the third entry is obtained by applying a function like k[s,f] to the first two entries (like data set dt3d below), then the function we use to style the data is slightly different:


dt3d = {##, k@##} & @@@ dt;

The first 10 rows of dt3d:


TableForm[dt3d[[;; 10]], TableHeadings -> {None, {"s", "f", "k[s, f]"}}]


Mathematica graphics


styleddata = Style[{#, #2}, PointSize[.02],
Piecewise[{{Orange, -1 <= #3 <= 0},
{Green, .5 <= #3 <= .9}, {Red, 1.2 <= #3 <= 1.6}}, Blue]] & @@@ dt3d;

We get the same picture as above using:


ListPlot[styleddata, DataRange -> {{-1, 1}, {-1, 1}}, Frame -> True,
ImageSize -> 500, AspectRatio -> 1, PlotLabel -> legend]


Original post:


Here are few alternative ways to use 2D plots / charts to visualize your data.


Graphics:


Graphics[{PointSize[Large],
{ColorData[{"TemperatureMap", {-2, 2}}][#3], Disk[{#, #2}, .1],
Black, Text[Style[#3, 14, Bold], {#, #2}]} & @@@ (Join @@
Table[{s, f, k[s, f]}, {s, -1, 1, 0.5}, {f, -1, 1, 0.5}])},
Frame -> True]

Mathematica graphics



MatrixPlot


MatrixPlot[Table[k[s, f], {s, -1, 1, 0.5}, {f, -1, 1, 0.5}], 
DataRange -> {{-1, 1}, {-1, 1}}, ColorFunction -> "TemperatureMap",
DataReversed -> True, PlotLegends -> Automatic]

Mathematica graphics


BubbleChart


BubbleChart[Labeled[Style[{#, #2, Abs@#3 /. 0. -> 1}, 
ColorData[{"TemperatureMap", {-2, 2}}][#3]], #3] & @@@ (Join @@
Table[{s, f, k[s, f]}, {s, -1, 1, 0.5}, {f, -1, 1, 0.5}]),

BubbleScale -> (1 &)]

Mathematica graphics


Comments

Popular posts from this blog

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...

dynamic - How can I make a clickable ArrayPlot that returns input?

I would like to create a dynamic ArrayPlot so that the rectangles, when clicked, provide the input. Can I use ArrayPlot for this? Or is there something else I should have to use? Answer ArrayPlot is much more than just a simple array like Grid : it represents a ranged 2D dataset, and its visualization can be finetuned by options like DataReversed and DataRange . These features make it quite complicated to reproduce the same layout and order with Grid . Here I offer AnnotatedArrayPlot which comes in handy when your dataset is more than just a flat 2D array. The dynamic interface allows highlighting individual cells and possibly interacting with them. AnnotatedArrayPlot works the same way as ArrayPlot and accepts the same options plus Enabled , HighlightCoordinates , HighlightStyle and HighlightElementFunction . data = {{Missing["HasSomeMoreData"], GrayLevel[ 1], {RGBColor[0, 1, 1], RGBColor[0, 0, 1], GrayLevel[1]}, RGBColor[0, 1, 0]}, {GrayLevel[0], GrayLevel...

list manipulation - Selecting multiple columns from a matrix?

Sample data: data = { {{2013, 1, 1}, 24.13, 167.67, 231.82}, {{2013, 1, 2}, 32.15, 170.92, 225.99}, {{2013, 1, 3}, 35.43, 172.68, 221.67}, {{2013, 1, 4}, 36.73, 173.05, 218.32}, {{2013, 1, 5}, 58.19, 165.96, 197.05}, {{2013, 1, 6}, 69.99, 163.50, 187.52}, {{2013, 1, 7}, 71.37, 154.21, 175.58}, {{2013, 1, 8}, 72.51, 149.66, 163.25}}; I want a DateListPlot with three graphs, so for a matrix formed by columns 1 and 2, one for columns 1 and 3, and 1 for columns 1 and 4. At the moment I'm using this code: data2 = Transpose[{data[[All, 1]], data[[All, 2]]}]; data3 = Transpose[{data[[All, 1]], data[[All, 3]]}]; data4 = Transpose[{data[[All, 1]], data[[All, 4]]}]; DateListPlot[{data2, data3, data4}, Joined -> True, Filling -> {3 -> {1}}] but I have a hunch that this can be done more efficiently. I don't like the Transpose s in particular. Any ideas? edit (for extra credit) What if I need to multiply the second column by 2, which in my solution is simp...