# Using tikz to plot for fortran

**URL:** <https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166>\
**Category:** Uncategorized\
**Created:** [June 8, 2024, 4:42am UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166 "2024-06-08T04:42:36Z")\
**Posts on this page:** 18\
**Page:** 1

<div class="post-metadata">

**Author:** ![fish830911](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/fish830911/32/2221_2.png) [@fish830911](https://fortran-lang.discourse.group/u/fish830911)\
**Post date:** [June 8, 2024, 4:42am UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/1 "2024-06-08T04:42:36Z")

</div>

Hi all:

I realized yesterday that you can use tikz to plot for the data that generated by Fortran. That is mind-blowing for me. So I wrote a simple module that can call from Fortran and generate a standalone tex file for you:

> <https://gist.github.com/huijunchen9260/58f46c3ba33ad9792ef0e34a87d525ef>

To call the `tikz` subroutine, you can use the following format:

```fortran
    call tikz(x, y, title, xlabel, ylabel, legend, name)

```

and now the legend is separated by a semicolon `;` and is plotted directly on the line (rather than having a box somewhere)

Hope someone finds this helpful! And if you find any bugs, feel free to let me know 😀

---

<div class="post-metadata">

**Author:** ![alozada](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/alozada/32/298_2.png) [@alozada](https://fortran-lang.discourse.group/u/alozada)\
**Post date:** [June 8, 2024, 1:01pm UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/2 "2024-06-08T13:01:11Z")

</div>

Nice!. Maybe it’s interesting to call ForColormap, [https://github.com/vmagnin/forcolormap](https://github.com/vmagnin/forcolormap), to define the color palette.

---

<div class="post-metadata">

**Author:** ![fish830911](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/fish830911/32/2221_2.png) [@fish830911](https://fortran-lang.discourse.group/u/fish830911)\
**Post date:** [June 8, 2024, 1:56pm UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/3 "2024-06-08T13:56:55Z")

</div>

Is it possible to generate hex number with forcolormap? I am using `xcolor` to define the color using the following code:

```fortran
write(unitno, *) "\definecolor{" // trim(colorname(i)) // "}{HTML}{" // trim(colorvec(i)) // "}"

```

I tried out forcolormap and it seems like it is using RGB?

---

<div class="post-metadata">

**Author:** ![vmagnin](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/vmagnin/32/28_2.png) [@vmagnin](https://fortran-lang.discourse.group/u/vmagnin)\
**Post date:** [June 8, 2024, 5:48pm UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/4 "2024-06-08T17:48:25Z")

</div>

> [@fish830911](#):
>
> I tried out forcolormap and it seems like it is using RGB?

Yes, Forcolormap is just returning three integers red, green, blue.  
But you can easily make the conversion to an hexadecimal string. See this code snippet:

```fortran
program main
  implicit none
  integer :: red, green, blue
  character(6) :: rgb

  red = 100
  green = 0
  blue = 255

  write(rgb, '(3z2.2)') red, green, blue
  print *, rgb
end program main

```

```shell
$ fpm run
Project is up to date
 6400FF

```

That is a functionality that could easily be added later in Forcolormap. I keep note.

---

<div class="post-metadata">

**Author:** ![Ali](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/ali/32/751_2.png) [@Ali](https://fortran-lang.discourse.group/u/Ali)\
**Post date:** [June 8, 2024, 7:32pm UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/5 "2024-06-08T19:32:36Z")

</div>

Maybe you might want to give the ForColor module of [ForImage](https://github.com/gha3mi/forimage) a try. Here you can find an example of how to convert a color to different color spaces like RGB, CMYK, HSV, HSL, XYZ, decimal and hex: [forimage/example/demo\_color.f90 at main · gha3mi/forimage · GitHub](https://github.com/gha3mi/forimage/blob/main/example/demo_color.f90)

---

<div class="post-metadata">

**Author:** ![vmagnin](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/vmagnin/32/28_2.png) [@vmagnin](https://fortran-lang.discourse.group/u/vmagnin)\
**Post date:** [June 8, 2024, 7:59pm UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/6 "2024-06-08T19:59:23Z")

</div>

And note that ForImage is a dependency of ForColormap.

---

<div class="post-metadata">

**Author:** ![RonShepard](https://avatars.discourse-cdn.com/v4/letter/r/a3d4f5/32.png) [@RonShepard](https://fortran-lang.discourse.group/u/RonShepard)\
**Post date:** [June 8, 2024, 11:20pm UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/7 "2024-06-08T23:20:32Z")

</div>

> [@fish830911](#):
>
> `write(unitno, *) "\definecolor{" // trim(colorname(i)) // "}{HTML}{" // trim(colorvec(i))`

Is `unitno` a character string? If so, then this looks like a complicated way to do the simple assignnment:

```auto
unitno = "\definecolor{" // trim(colorname(i)) // "}{HTML}{" // trim(colorvec(i))

```

The programmer only needs the internal write if there are conversions from from other data types (integer, real, etc.) to type character. In this case, it is just concatenating some strings together to form a single string, and that is built in to the language, the internal write is unnecessary.

---

<div class="post-metadata">

**Author:** ![fish830911](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/fish830911/32/2221_2.png) [@fish830911](https://fortran-lang.discourse.group/u/fish830911)\
**Post date:** [June 9, 2024, 2:19am UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/8 "2024-06-09T02:19:56Z")

</div>

No, the `unitno` is for the external file to write that line to. So I need the `write`.

---

<div class="post-metadata">

**Author:** ![fish830911](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/fish830911/32/2221_2.png) [@fish830911](https://fortran-lang.discourse.group/u/fish830911)\
**Post date:** [June 9, 2024, 2:40am UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/9 "2024-06-09T02:40:19Z")

</div>

Thanks! I will try this out. What functionality do you think I should add to this child project? I am thinking about contour plots and how to implement it in tikz.

---

<div class="post-metadata">

**Author:** ![vmagnin](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/vmagnin/32/28_2.png) [@vmagnin](https://fortran-lang.discourse.group/u/vmagnin)\
**Post date:** [June 9, 2024, 6:54pm UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/10 "2024-06-09T18:54:58Z")

</div>

> [@fish830911](#):
>
> What functionality do you think I should add to this child project? I am thinking about contour plots and how to implement it in tikz.

You can find inspiration in the list of plots supported by Gnuplot: [Demos for gnuplot version 6.0](https://gnuplot.sourceforge.net/demo/)

There are so many things you could add. So my advice would be: start with your own needs. Your motivation will be high. And people will later ask you if could add other features, or even make a Pull Request with their own work.

---

<div class="post-metadata">

**Author:** ![Dobrodzieju](https://avatars.discourse-cdn.com/v4/letter/d/c5a1d2/32.png) [@Dobrodzieju](https://fortran-lang.discourse.group/u/Dobrodzieju)\
**Post date:** [June 10, 2024, 6:37am UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/11 "2024-06-10T06:37:58Z")

</div>

Maybe you should consider using the pgfplots package, which is much more user-friendly than bare-bones tikz. Besides, it includes contour plotting, 3-dimensional diagrams and more

---

<div class="post-metadata">

**Author:** ![Beliavsky](https://avatars.discourse-cdn.com/v4/letter/b/ba8739/32.png) [@Beliavsky](https://fortran-lang.discourse.group/u/Beliavsky)\
**Post date:** [June 10, 2024, 12:44pm UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/12 "2024-06-10T12:44:04Z")

</div>

Since many people are interested in your module, please consider making your gist a repository, so that people can raise issues and so I can it add it to the [Graphics, Plotting, and User Interfaces section](https://github.com/Beliavsky/Fortran-code-on-GitHub?tab=readme-ov-file#graphics-plotting-and-user-interfaces) of my list of Fortran codes.

---

<div class="post-metadata">

**Author:** ![hkvzjal](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/hkvzjal/32/3055_2.png) [@hkvzjal](https://fortran-lang.discourse.group/u/hkvzjal)\
**Post date:** [June 10, 2024, 2:02pm UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/13 "2024-06-10T14:02:29Z")

</div>

If you follow @Beliavsky suggestion, consider making your file `.F90` instead and then change this commented module

> [@fish830911](#):
>
> `! use ifport `

with a C preprocessed

```auto
#if __INTEL_COMPILER
use ifport 
#endif

```

Does your module have a strong dependency on OpenMP? otherwise you can also use [conditional compilation sentinels](https://gcc.gnu.org/onlinedocs/libgomp/Enabling-OpenMP.html) decorating OpenMP with `!$ ` to enable compiling without as well

```Fortran
!$ omp_lib
...
thread_id = 0
!$ thread_id = omp_get_thread_num()
write(tmpChar5,'(i0)') thread_id 
unitno = 726+thread_id 

```

---

<div class="post-metadata">

**Author:** ![fish830911](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/fish830911/32/2221_2.png) [@fish830911](https://fortran-lang.discourse.group/u/fish830911)\
**Post date:** [June 10, 2024, 5:12pm UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/14 "2024-06-10T17:12:25Z")

</div>

In the template I am using I did use the pgfplots:

The following chuck of fortran code generate the templates:

```fortran
    open(unitno, file=trim(fpath) // trim(tikz),status='unknown')
       write(unitno, *) "\documentclass[tikz]{standalone}"

       write(unitno, *) "\usepackage{tikz}"
       write(unitno, *) "\usepackage{pgfplots}"
       write(unitno, *) "\usetikzlibrary{decorations}"
       write(unitno, *) "\usetikzlibrary{decorations.pathreplacing, intersections, fillbetween}"
       write(unitno, *) "\usetikzlibrary{calc,positioning}"
       write(unitno, *) "\pgfplotsset{compat=newest, scale only axis, width = 13cm, height = 6cm}"
       write(unitno, *) "\pgfplotsset{sciclean/.style={axis lines=left,"
       write(unitno, *) " axis x line shift=0.5em,"
       write(unitno, *) " axis y line shift=0.5em,"
       write(unitno, *) " axis line style={-,very thin},"
       write(unitno, *) " axis background/.style={draw,ultra thin,gray},"
       write(unitno, *) " tick align=outside,"
       write(unitno, *) " xtick distance=" // num2str(xticsdist) // ","
       write(unitno, *) " ytick distance=" // num2str(yticsdist) // ","
       write(unitno, *) " major tick length=2pt}}"
       write(unitno, *) ""
       write(unitno, *) "% Create fake \onslide and other commands for standalone picture"
       write(unitno, *) "\usepackage{xparse}"
       write(unitno, *) "\NewDocumentCommand{\onslide}{s t+ d<>}{}"
       write(unitno, *) "\NewDocumentCommand{\only}{d<>}{}"
       write(unitno, *) "\NewDocumentCommand{\uncover}{d<>}{}"
       write(unitno, *) "\NewDocumentCommand{\visible}{d<>}{}"
       write(unitno, *) "\NewDocumentCommand{\invisible}{d<>}{}"
       write(unitno, *) ""
       write(unitno, *) "\makeatletter"
       write(unitno, *) "\tikzset{"
       write(unitno, *) "Sloped/.code = {"
       write(unitno, *) "\iftikz@fullytransformed% tikz.code.tex"
       write(unitno, *) " \tikzset{sloped}"
       write(unitno, *) "\else"
       write(unitno, *) " \pgfgettransformentries{\mya}{\myb}{\myc}{\myd}{\mys}{\myt}%"
       write(unitno, *) " \tikzset{sloped, transform shape, rotate = {atan2(\myb,\mya)}}%"
       write(unitno, *) "\fi"
       write(unitno, *) "}"
       write(unitno, *) "}"
       write(unitno, *) "\makeatother"
       write(unitno, *) ""
       write(unitno, *) "% ---------------------------------------------------------------------"
       write(unitno, *) "% Coordinate extraction"
       write(unitno, *) "% #1: node name"
       write(unitno, *) "% #2: output macro name: x coordinate"
       write(unitno, *) "% #3: output macro name: y coordinate"
       write(unitno, *) "\newcommand{\Getxycoords}[3]{%"
       write(unitno, *) " \pgfplotsextra{%"
       write(unitno, *) " % using `\pgfplotspointgetcoordinates' stores the (axis)"
       write(unitno, *) " % coordinates in `data point' which then can be called by"
       write(unitno, *) " % `\pgfkeysvalueof' or `\pgfkeysgetvalue'"
       write(unitno, *) " \pgfplotspointgetcoordinates{(#1)}%"
       write(unitno, *) " % `\global' (a TeX macro and not a TikZ/PGFPlots one) allows to"
       write(unitno, *) " % store the values globally"
       write(unitno, *) " \global\pgfkeysgetvalue{/data point/x}{#2}%"
       write(unitno, *) " \global\pgfkeysgetvalue{/data point/y}{#3}%"
       write(unitno, *) " }%"
       write(unitno, *) "}"
       write(unitno, *) "% ---------------------------------------------------------------------"
       write(unitno, *) ""
       write(unitno, *) "\begin{document}"
       write(unitno, *) ""
       write(unitno, *) "\begin{tikzpicture}"
       write(unitno, *) ""
       write(unitno, *) ""
       write(unitno, *) "\begin{axis}["
       write(unitno, *) " sciclean,"
       write(unitno, *) " xlabel = {" // xlb // "},"
       write(unitno, *) " ylabel = {" // ylb // "},"
       write(unitno, *) " xmin = " // num2str(xmin) // ","
       write(unitno, *) " xmax = " // num2str(xmax) // ","
       write(unitno, *) " ymin = " // num2str(ymin) // ","
       write(unitno, *) " ymax = " // num2str(ymax) // ","
       write(unitno, *) " legend cell align = left,"
       write(unitno, *) " legend pos = south east,"
       write(unitno, *) " title = {" // title // "}]"
       write(unitno, *) ""
       write(unitno, *) ""
       call plotting(unitno, nj, palette, cnames, fpath, dat, legend)
       write(unitno, *) ""
       write(unitno, *) ""
       write(unitno, *) "\end{axis}"
       write(unitno, *) ""
       write(unitno, *) ""
       write(unitno, *) "\end{tikzpicture}"
       write(unitno, *) ""
       write(unitno, *) "\end{document}"
    close(unitno)

```

---

<div class="post-metadata">

**Author:** ![fish830911](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/fish830911/32/2221_2.png) [@fish830911](https://fortran-lang.discourse.group/u/fish830911)\
**Post date:** [June 10, 2024, 8:20pm UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/15 "2024-06-10T20:20:43Z")

</div>

I guess this might be a newbie question: what is C preprocessed?

I try to add the `#if` chuck into the code and somehow it is not compiled. The error is

```fortran
<ERROR> *cmd_run* Targets error: Unable to find source for module dependency: "ifport" used by "././src/tikz_module

```

I am using gfortran to compile it, and I guess it tries to load `ifport` and failed.

I have used `ifport` because this code is adapted from Grey Gorden’s `mod_plot.f90` for gnuplot:

> **[Grey Gordon - Code](https://sites.google.com/site/greygordon/code)**
>
> Code for papers
> 
> calibration.zip
> Tools for "A Practical Approach to Testing Calibration Strategies" with Yongquan Cao. This code includes both the Fortran MPI routine for computing simulated moments in parallel and the Stata code for analyzing the...

And I am actually not sure why he needs `ifport` for `ifort` compiler.

I think your suggestion for removing needs to compile with openmp is great 😀

---

<div class="post-metadata">

**Author:** ![hkvzjal](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/hkvzjal/32/3055_2.png) [@hkvzjal](https://fortran-lang.discourse.group/u/hkvzjal)\
**Post date:** [June 10, 2024, 8:37pm UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/16 "2024-06-10T20:37:07Z")

</div>

Did you change the file suffix to capital F (`.F90` instead of `.f90`)? Otherwise you have to add the flag `-cpp` with gfortran or `-fpp` with ifort to enable preprocessing the file

---

<div class="post-metadata">

**Author:** ![hkvzjal](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/hkvzjal/32/3055_2.png) [@hkvzjal](https://fortran-lang.discourse.group/u/hkvzjal)\
**Post date:** [June 10, 2024, 8:46pm UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/17 "2024-06-10T20:46:20Z")

</div>

> [@fish830911](#):
>
> what is C preprocessed?

Basically, the defacto mechanism in Fortran to enable conditional compilation. Which is borrowed from C.

---

<div class="post-metadata">

**Author:** ![fish830911](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/fish830911/32/2221_2.png) [@fish830911](https://fortran-lang.discourse.group/u/fish830911)\
**Post date:** [June 11, 2024, 3:10am UTC](https://fortran-lang.discourse.group/t/using-tikz-to-plot-for-fortran/8166/18 "2024-06-11T03:10:17Z")

</div>

Hello @Beliavsky , this is my github page for tikz-fortran:

> **[GitHub - huijunchen9260/tikz-fortran](https://github.com/huijunchen9260/tikz-fortran)**
>
> Contribute to huijunchen9260/tikz-fortran development by creating an account on GitHub.

Thank you!
